首頁 >後端開發 >C++ >如何使用反射動態建立通用 C# 物件?

如何使用反射動態建立通用 C# 物件?

Barbara Streisand
Barbara Streisand原創
2025-01-22 09:47:09443瀏覽

How Can I Dynamically Create Generic C# Objects Using Reflection?

利用反射動態建立泛型 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」)動態建立 TaskATaskB 的實例。

解決方案可透過以下步驟實現:

  1. 取得基底類型 (Task<T>)。
  2. 將要提供的型別參數定義為陣列(例如,new Type[] { typeof(Item) })。
  3. 使用 Type.MakeGenericType 產生特定類型 (TaskATaskB)。
  4. 使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn