Получение общих типов аргументов - PullRequest
0 голосов
/ 23 октября 2009

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

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

Ответы [ 4 ]

1 голос
/ 23 октября 2009

Отражение - это технология .NET - она ​​не специфична ни для VB.NET, ни для C #.

Для данного объекта o используйте

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

ОднакоЭто, вероятно, плохая идея явно менять свое поведение в зависимости от типа.Если вам нужно делать разные вещи на основе класса «A» и класса «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 голосов
/ 23 октября 2009

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

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

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

Вам гораздо лучше добавить виртуальный метод "Talk" в Animal и переопределить его в Dog и Cat, чтобы ваш метод стал:

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

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

0 голосов
/ 23 октября 2009

работает ли typeof?

Type t = typeof (Apple); string className = t.ToString ();

0 голосов
/ 23 октября 2009
public class MyClass<T>
{
    public void MyMethod()
    {
        if (typeof(T).GetGenericArguments().First() == typeof(int))
        {
            Console.WriteLine("Hello World!!!");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...