检索通用参数类型

时间:2009-10-23 02:05:28

标签: .net vb.net reflection

我正在使用VB.Net。我有一个名为clsA的对象类(T为clsB)。根据T是什么,我想做不同的事情。假设clsC和clsD都继承了clsB,因此可以用于T。

如果我有一个clsA(clsC)的实例,我如何使用反射得到内部类型(即clsC)?

4 个答案:

答案 0 :(得分:1)

Reflection是一种.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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是工作类型吗?

输入t = typeof(Apple);    string className = t.ToString();

答案 3 :(得分:0)

我很想看到你正在尝试做的具体例子。每当您发现自己根据对象的类型采取不同的操作时,就表明您需要重新访问对象模型。

这是一个非常人为的例子:

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

你最好向Animal添加一个虚拟的“Talk”方法,并在Dog和Cat中覆盖它,这样你的方法就变成了:

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

您能否以一种通用类不需要过多了解其参数化类型的方式重构代码?