如何实例化此';具有泛型参数的类';在运行时
本文关键字:参数 运行时 泛型 实例化 | 更新日期: 2023-09-27 18:21:59
考虑以下代码行:
classA<classB> C;
我想在运行时使用System.Reflection创建C的实例。为此,我需要在运行时知道类A和类B的类型。
我知道如何获得classB类型
Type classBType = AssemblyContaingClassB.GetType("namespace.classB");
Q1>如何使用此classBType获取classA的类型?
Q2>我知道要在运行时创建实例,我们调用以下代码行:
object C = Activator.CreateInstance(TypeName);
要创建C的实例,上面的代码应该使用什么TypeName?classA的类型是否足以创建此实例
如果这个问题太基本,请提前感谢并道歉。我是c#的新手。
编辑:
问题已修复。根据p.s.w.g的回答,获取具有泛型参数的类的类型存在问题。关于如何获取泛型参数类型的解决方案可以在这里找到。在那之后,我只是按照p.s.w.g的回答和它的工作做了。
您可以在打开的通用classA<>
类型上使用MakeGenericType
方法:
Type classBType = ... get from somewhere at runtime
Type classAType = typeof(classA<>).MakeGenericType(classBType);
object classAInstance = Activator.CreateInstance(classAType);
MakeGenericType
将关闭classA<>
泛型并使其能够实例化。
考虑到您的最新更新,问题似乎是在运行时加载类型classA<>
。为了避免命名冲突,C#编译器生成一个类似SimpleClassName`N
的名称,其中N
是泛型类型参数的数量,因此要通过反射获得classA<>
类型,请使用名称namespace.classA`1
。之后,您只需使用MakeGenericType
方法:
var classAType = AssemblyContaingClassA.GetType("namespace.classA`1");
var classBType = AssemblyContaingClassB.GetType("namespace.classB");
var genericType = classAType.MakeGenericType(classBType);
object instance = Activator.CreateInstance(genericType);
当然,除非让在运行时加载类型,否则在编译时使用typeof
运算符获取类型会更容易、更安全
var classAType = typeof(classA<>);
var classBType = typeof(classB);
var genericType = classAType.MakeGenericType(classBType);
object instance = Activator.CreateInstance(genericType);