首页 >后端开发 >C++ >如何使用反射动态创建通用 C# 对象?

如何使用反射动态创建通用 C# 对象?

Barbara Streisand
Barbara Streisand原创
2025-01-22 09:47:09435浏览

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