利用反射动态创建泛型 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中文网其他相关文章!