[英]Retrieving Generic Argument Types
我正在使用VB.Net。 我有一個名為clsA(屬於T的clsB)的對象類。 根據T是什么,我想做不同的事情。 假設clsC和clsD都繼承了clsB,因此可以用於T。
如果我有clsA(clsC)的實例,如何使用反射來獲取內部類型(即clsC)?
反射是一種.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
public class MyClass<T>
{
public void MyMethod()
{
if (typeof(T).GetGenericArguments().First() == typeof(int))
{
Console.WriteLine("Hello World!!!");
}
}
}
typeof在工作嗎?
類型t = typeof(Apple); 字符串className = t.ToString();
我希望看到您正在嘗試做的具體示例。 每當您發現自己根據對象的類型采取不同的操作時,這表明您需要重新訪問對象模型。
這是一個真正的例子:
public void Talk(Animal a)
{
if (a is Dog)
{
Console.WriteLine("Woof!");
}
else if (a is Cat)
{
Console.WriteLine("Meow!");
}
}
您最好將一個虛擬的“對話”方法添加到Animal並在Dog and Cat中覆蓋它,這樣您的方法將變為:
public void Talk(Animal a)
{
a.Talk();
}
您是否可以通過這種方式重構代碼,使得泛型類不需要過多地了解其參數化類型?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.