考虑以下代码行:
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的答案和它的工作。
答案 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);