我被C#錯誤輕微混淆。C#類型或命名空間預期混淆
Type t = thing.GetType()
t
現在是一個類型。但是,如果我試圖做到這一點:
new GenericThing<t>
我得到一個警告說,預計類型或命名空間。我錯過了什麼?
我被C#錯誤輕微混淆。C#類型或命名空間預期混淆
Type t = thing.GetType()
t
現在是一個類型。但是,如果我試圖做到這一點:
new GenericThing<t>
我得到一個警告說,預計類型或命名空間。我錯過了什麼?
t
是在運行時創建的Type對象。泛型期望類型名稱,在編譯時解析。要創建一個通用的在運行時,你必須使用MakeGenericType
例如:
Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
t
是Type
類型的對象實例,即東西,只存在於運行。泛型在編譯時工作,並期望類型的名稱。
我想你同意以下無厘頭:
Type t = thing.GetType()
TypeOfThing instance = new t();
而出於同樣的原因,你不能傳遞一個類型實例作爲通用的參數。
Type
是一類代表一個類型,而不是實際爲之一,所以你不能在預期的類型或類型參數的場所使用的Type
一個實例。
你應該做這樣的事情:
var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);