簡體   English   中英

檢索通用參數類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM