我正在使用VB.Net。我有一个名为clsA的对象类(T为clsB)。根据T是什么,我想做不同的事情。假设clsC和clsD都继承了clsB,因此可以用于T。
如果我有一个clsA(clsC)的实例,我如何使用反射得到内部类型(即clsC)?
答案 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();
}
您能否以一种通用类不需要过多了解其参数化类型的方式重构代码?