利用反射動態建立泛型 C# 物件
在 C# 開發中,經常需要動態建立泛型物件。由於類型資訊並非始終可用,這帶來了挑戰。本文將探討如何使用反射和 Activator.CreateInstance
方法解決此問題。
假設我們有以下類別:
<code class="language-csharp">public class Item { } public class Task<T> { } public class TaskA<T> : Task<T> { } public class TaskB<T> : Task<T> { }</code>
我們的目標是根據表示其完全限定類型名稱的字串(例如,「namespace.TaskA」或「namespace.TaskB」)動態建立 TaskA
或 TaskB
的實例。
解決方案可透過以下步驟實現:
Task<T>
)。 new Type[] { typeof(Item) }
)。 Type.MakeGenericType
產生特定類型 (TaskA
或 TaskB
)。 Activator.CreateInstance
實例化泛型物件。 例如,使用反射建立 TaskA<Item>
物件:
<code class="language-csharp">var taskType = typeof(Task); Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
如果型別名稱指定為字串,可以使用下列方法:
<code class="language-csharp">var taskType = Type.GetType("namespace.TaskA`1"); //注意`1`表示泛型参数个数 Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
此技術允許根據類型名稱動態實例化泛型對象,為運行時處理未知泛型類型提供靈活且強大的解決方案。 請注意,Type.GetType
方法需要完整的命名空間訊息,並且 TaskA
後面的 1
表示該泛型類別有一個類型參數。
以上是如何使用反射動態建立通用 C# 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!