2011-08-19 41 views
5

我被C#錯誤輕微混淆。C#類型或命名空間預期混淆

Type t = thing.GetType()

t現在是一個類型。但是,如果我試圖做到這一點:

new GenericThing<t>

我得到一個警告說,預計類型或命名空間。我錯過了什麼?

回答

2

t是在運行時創建的Type對象。泛型期望類型名稱,在編譯時解析。要創建一個通用的在運行時,你必須使用MakeGenericType

例如:

Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t)); 
2

tType類型的對象實例,即東西,只存在於運行。泛型在編譯時工作,並期望類型的名稱。

我想你同意以下無厘頭:

Type t = thing.GetType() 
TypeOfThing instance = new t(); 

而出於同樣的原因,你不能傳遞一個類型實例作爲通用的參數。

1

Type是一類代表一個類型,而不是實際之一,所以你不能在預期的類型或類型參數的場所使用的Type一個實例。

0

你應該做這樣的事情:

var youGeneric = typeof(GenericThing<>).MakeGenericType(t) 
             .GetConstructor(Type.EmptyTypes) 
             .Invoke(null);