3

考虑以下代码行:

classA<classB> C;

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

我知道如何获得classB的类型

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

Q1> 如何使用这个classBType来获取classA的类型?

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

object C = Activator.CreateInstance(TypeName);

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

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

编辑:

问题已修复。从 pswg 的回答来看,使用泛型参数获取类的类型存在问题。关于如何获取泛型参数类型的解决方案可以在这里找到。之后我只是做了pswg的回答建议和它的工作。

4

2 回答 2

8

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

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

MakeGenericType将关闭classA<>泛型并使实例化成为可能。

于 2013-07-11T06:03:15.453 回答
4

鉴于您的最新更新,问题似乎是classA<>在运行时加载类型。为避免命名冲突,C# 编译器会生成一个名称,例如SimpleClassName`Nwhere Nis the number of generic type parameters,因此要classA<>通过反射获取类型,请使用 name 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);
于 2013-07-11T06:02:36.313 回答