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

本文关键字:参数 运行时 泛型 实例化 | 更新日期: 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);