簡體   English   中英

通用類型參數和動態類型

[英]Generic Type parameter and the dynamic type

在下面的示例中,我想知道TrickyGenericMethodif語句是一個壞主意,或者在某些情況下是否可以。 就我而言,我有一個工廠方法,該方法使用通用參數來產生正確的結果。 不幸的是,如果傳入的對象的類型引用是對接口或抽象類的引用,則將產生不正確的結果,因為T不是對象的實際類型。

class Program
{
    static void Main(string[] args)
    {
        HasGenericMethod hgm = new HasGenericMethod();
        Console.WriteLine(hgm.GenericMehtod("string"));
        Console.WriteLine(hgm.GenericMehtod((object)"object"));

        Console.WriteLine();

        Console.WriteLine(hgm.TrickyGenericMethod("string"));
        Console.WriteLine(hgm.TrickyGenericMethod((object)"object"));


        Console.ReadKey();
    }
}

class HasGenericMethod
{
    public string GenericMehtod<T>(T param)
    {
        return  "Type of T:\t" + typeof(T) + "\tType of param:\t" + param.GetType();
    }

    public string TrickyGenericMethod<T>(T param)
    {
        if (typeof(T) != param.GetType())
        {
            return TrickyGenericMethod((dynamic)param);
        }
        return "Type of T:\t" + typeof(T) + "\tType of param:\t" + param.GetType(); ;
    }
}

TrickyGenericMethod中的if語句是一個壞主意

是的,在我看來。 特別是,如果您使用內部類型的值從其他程序集中調用此方法(並且它會通過此路徑一次),則“執行時間編譯器”將為dynamic調用使用最佳可訪問類型...最終將導致堆棧溢出。

編輯:該示例代碼...

// Library.cs
using System;

public class Library
{
    public static void Foo<T>(T value)
    {
        Console.WriteLine("{0} : {1}", typeof(T), value.GetType());
        if (typeof(T) != value.GetType())
        {
            dynamic d = value;
            Foo(d);
        }
    }
}

// Test.cs
class Internal {}
class Program
{
    static void Main(string[] args)  
    {
        Library.Foo<object>(new Internal());
    }
}

結果:

System.Object : Internal
System.Object : Internal
...
System.Object : Internal

Process is terminated due to StackOverflowException.

在其他類似情況下,它可能也不起作用。 我將盡量避免依賴typeof(T) == value.GetType()

您可以無條件地使用動態類型調用私有實現方法,這樣您最終只能嘗試一次,並最終獲得“盡力而為”的方法。

首先,這是一個壞主意,因為您正在以不必要的方式使用遞歸,您最多會有一個其他的調用,因此為什么要將其遞歸,私有幫助程序方法將更加清晰,並且一般情況下更不會出錯。

2,您正在測試T何時等於GetType()並遞歸直到它等於零,因此只需直接使用GetType()的結果並對其進行處理即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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