簡體   English   中英

無法使用通用方法類型 <T> 直接在Activator.CreateInstance中

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

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