[英]Unable to use generic method type <T> directly in Activator.CreateInstance
我正在研究一種通用方法,該方法將對從CollectionBase派生的自定義集合進行操作。 泛型方法將完成比示例代碼所示更多的工作,但這代表了我的問題的實質。
當我嘗試以下操作時,在CreateInstance()調用中指定了參數T時,出現編譯器錯誤“類型參數名稱此時無效”:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(T) as T;
}
相反,我必須使用typeof(T)並將其傳遞給CreateInstance:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
var targetType = typeof (T);
return Activator.CreateInstance(targetType) as T;
}
沒什么大不了的,但是還有另一種方法來聲明我的GetInstance方法,以便像第一個示例中那樣將T直接傳遞給Activator.CreateInstance()嗎? 在這種情況下,我對通用類型“ T”的使用是否被接受?
我想我的問題的實質是我假設T是實際類型。 但是編譯器錯誤和需要調用typeof(T)似乎表明它是類型的名稱。
是的, Activator.CreateInstance
具有一個接受泛型類型參數的重載:
return Activator.CreateInstance<T>();
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(typeof(T)) as T;
}
要么:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance<T>();
}
T
是類型,而不是System.Type
實例。
就像您需要編寫CreateInstance(typeof(Exception))
而不是CreateInstance(Exception)
,您也需要編寫CreateInstance(typeof(T))
而不是CreateInstance(T)
要么
public CollectionBase GetInstance<T>() where T : CollectionBase, new()
{
return new T();
}
假設您有一個名為MyClass的類。
如果要使用Activator.CreateInstance,則仍然需要執行Activator.CreateInstance(typeof(MyClass))
這是因為MyClass實際上引用了MyClass的靜態版本(在其上您稱之為靜態方法)。
而是typeof(MyClass)返回類System.Type的實例。
編輯
我知道沒有真正的靜態版本。 那只是顯示MyClass和typeof(MyClass)之間差異的一種構造。 雖然我沒有完全錯。 如果您有兩個應用程序共享包含MyClass的類庫,而MyClass具有靜態成員公共類MyClass
{
private static int myStaticMember = 0;
}
然后,由於.NET的沙箱操作,這兩個應用程序具有單獨的MyClass靜態版本,並且不共享該成員。 實際上,它們每個都有一個“ MyClass的靜態實例” ...看起來似乎是矛盾的:)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.