此C#代碼段使用使用實例化類型作為通用類型參數進行探索,該任務不直接由編譯器支持。 本文正確地指出,嘗試直接使用Type
變量(例如myType
)作為通用類型參數會導致編譯器錯誤。
方法。此方法動態創建了一種基於通用類型定義的新類型,並提供了類型的參數。 然後,方法實例化了此新創建的類型的對象。 MakeGenericType
。
Activator.CreateInstance
改進文章,請考慮添加:
如果找不到類型,則MakeGenericType
>錯誤處理:
。 添加零檢查將使代碼更強大。
>Type.GetType
>績效注意事項:null
>提及反射通常比直接通用實例化的速度慢,對於讀者來說,要理解權衡取捨至關重要。 該方法應保留用於在編譯時不知道類型的情況。 出現的問題是,是否有可能使用在運行時獲得的類型作為類型參數實例化類型。 如下所示,嘗試直接嘗試這會導致編譯器錯誤:
>
其中
> 錯誤消息通常是“找不到類型或名稱空間'mytype'。這是因為必須在編譯時知道通用類型參數。
> 基於反射的解決方案>
:動態通用實例string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!
MyGenericClass
反射提供了使用
public class MyGenericClass<T> { }
string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!
此代碼首先檢查Type.GetType
是否返回了有效的類型。 然後,它使用MakeGenericType
>創建特定的通用類型(在這種情況下為Generic<string>
)和Activator.CreateInstance
>創建一個實例。控制台輸出確認了成功的實例化。
>處理多種類型參數
>對於具有多個類型參數的通用類,只需將類型參數提供給MakeGenericType
>作為逗號分隔列表:
public class MyGenericClass<T> { }
重要的考慮因素:
Type.GetType
以上是您可以將實例化類型作為c#generics中的類型參數傳遞嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!