[英]Generic Type parameter and the dynamic type
在下面的示例中,我想知道TrickyGenericMethod
的if
語句是一個壞主意,或者在某些情況下是否可以。 就我而言,我有一個工廠方法,該方法使用通用參數來產生正確的結果。 不幸的是,如果傳入的對象的類型引用是對接口或抽象類的引用,則將產生不正確的結果,因為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.