如何在运行时实例化此“具有泛型参数的类”

时间:2013-07-11 06:00:48

标签: c#

考虑以下代码行:

classA<classB> C;

我想通过使用System.Reflection在运行时创建C的实例。为此,我需要在运行时知道classA和classB的类型。

我知道如何获得 classB

的类型
Type classBType = AssemblyContaingClassB.GetType("namespace.classB");

Q1&GT;如何使用 classBType 获取 classA 的类型?

Q2&GT;我知道要在运行时创建实例,我们调用以下代码行:

object C = Activator.CreateInstance(TypeName);

要创建 C 的实例,代码使用的TypeName应该是什么?将足以创建此实例的classA类型

如果这个问题太基础,请提前致谢并道歉。我是c#的新手。

修改

问题是固定的。从p.s.w.g的答案来看,使用泛型参数获取类的类型存在问题。可以找到有关如何获取泛型参数类型的解决方案here。之后我就做了p.s.w.g的答案和它的工作。

2 个答案:

答案 0 :(得分:8)

您可以在开放式通用classA<>类型上使用MakeGenericType方法:

Type classBType = ... get from somewhere at runtime
Type classAType = typeof(classA<>).MakeGenericType(classBType);
object classAInstance = Activator.CreateInstance(classAType);

MakeGenericType将关闭classA<>泛型并使其可以实例化。

答案 1 :(得分:4)

鉴于您的最新更新,似乎问题是在运行时加载类型classA<>。为了避免命名冲突,C#编译器生成一个类似SimpleClassName`N的名称,其中N是泛型类型参数的数量,因此要通过反射获取classA<>类型,请使用名称{{1} }。之后,您只需使用MakeGenericType方法:

namespace.classA`1

当然,除非在运行时加载类型,否则使用typeof运算符在编译时获取类型会更容易,更安全:

var classAType = AssemblyContaingClassA.GetType("namespace.classA`1");
var classBType = AssemblyContaingClassB.GetType("namespace.classB");
var genericType = classAType.MakeGenericType(classBType);

object instance = Activator.CreateInstance(genericType);