2009-10-23 5 views
0

Я использую VB.Net. У меня есть класс объектов, называемый clsA (из T как clsB). В зависимости от того, что Т, я хочу делать разные вещи. Предположим, что clsC и clsD наследуют clsB и поэтому могут быть использованы для T.Извлечение общих типов аргументов

Если у меня есть экземпляр clsA (из clsC), как я могу получить внутренний тип (т. Е. ClsC) с использованием отражения?

ответ

1

Отражение - это технология .NET - это не относится ни к VB.NET, ни к C#.

Учитывая объект, о, используйте

o.GetType().GetGenericArguments()(0)

Однако, вероятно, это плохая идея явно Меняйте поведение в зависимости от типа. Если вам нужно делать разные вещи, основанные на класс «А» против класса «B», то вы должны использовать виртуальные методы или свойства, и переопределить их в производных типов:

Public MustInherit Class BaseClass 
    Public MustOverride Function OneMethodTwoWays() As Integer 

    Public MustOverride ReadOnly Property OnePropertyTwoWays() As Integer 

End Class 

Public Class DerivedClass1 
    Inherits BaseClass 


    Public Overrides Function OneMethodTwoWays() As Integer 
     Return 1 + 1 
    End Function 

    Public Overrides ReadOnly Property OnePropertyTwoWays() As Integer 
     Get 
      Return 1 + 1 
     End Get 
    End Property 
End Class 

Public Class DerivedClass2 
    Inherits BaseClass 

    Public Overrides Function OneMethodTwoWays() As Integer 
     Return 2 * 1 
    End Function 

    Public Overrides ReadOnly Property OnePropertyTwoWays() As Integer 
     Get 
      Return 2 * 1 
     End Get 
    End Property 
End Class 

Public Class MyGeneric(Of T As BaseClass) 
    Public Function DoTheyMatch(ByVal a As T, ByVal b As T) As Boolean 
     Return a.OneMethodTwoWays() = b.OnePropertyTwoWays 
    End Function 
End Class 
+0

Спасибо, именно то, что мне нужно. – link664

0
public class MyClass<T> 
{ 
    public void MyMethod() 
    { 
     if (typeof(T).GetGenericArguments().First() == typeof(int)) 
     { 
      Console.WriteLine("Hello World!!!"); 
     } 
    } 
} 
0

является TypeOf рабочим ?

тип t = типof (Apple); string className = t.ToString();

0

Я хотел бы видеть конкретный пример того, что вы пытаетесь сделать. Всякий раз, когда вы обнаруживаете, что выполняете разные действия в зависимости от типа объекта, это признак того, что вам нужно вернуться к своей объектной модели.

Вот действительно надуманный пример:

public void Talk(Animal a) 
{ 
    if (a is Dog) 
    { 
     Console.WriteLine("Woof!"); 
    } 
    else if (a is Cat) 
    { 
     Console.WriteLine("Meow!"); 
    } 
} 

Вы гораздо лучше добавить виртуальный «Talk» метод для животных и опрокинув его для собак и кошек, так что ваш метод становится:

public void Talk(Animal a) 
{ 
    a.Talk(); 
} 

Можете ли вы реорганизовать свой код таким образом, чтобы универсальному классу не нужно было слишком много знать о его параметризованном типе?

+0

Мой недавний пример этого был с поиском Solr. Он возвращает объект xml на основе конфигурации. Поэтому у меня есть проект, который генерирует класс на основе схемы Solr и заполняет его из ответа xml. Надеюсь, это имеет смысл. –

+0

Я хочу, чтобы иметь возможность собирать значения в зависимости от T, а затем создать новый экземпляр T. Используя ваш пример, я хочу объявить Object (of Dog), а затем установить свойство Toy как экземпляр Bone. Если я объявляю Object (of Cat), Toy должен быть экземпляром Mouse. Как только это свойство будет установлено, я создам новый экземпляр Cat/Dog с свойством Toy для набора объектов. Я знаю, что есть множество способов сделать это, но есть и другие факторы, почему я иду по этому пути. – link664

+0

@ link664 - достаточно справедливо. Я просто хотел поместить это там, чтобы другие могли видеть, что иногда есть лучший вариант. –

Смежные вопросы