C# – 如何在运行时获取’class with generic parameter’?

我有一个generics类,如下所示:

using System.Collections.Generic; namespace MyNameSpace { public class MyClass : MyAnotherClass { public MyClass(); public MyClass(T obj); public T Object { get; set; } } } 

我不明白为什么下面的代码行返回null( throwing exception with message : "Could not load type 'MyClass' from assembly '//assembly details//' " )”

 Type MyClassType = AssemblyContaingMyClass.GetType("MyNameSpace.MyClass"); 

Assembly.GetType(className)与generics类一起使用是违法的吗?

您能否建议在运行时获取generics类的替代方法?

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

编辑:

忘了提。 包含MyClass的程序集将在运行时加载。

我认为你必须使用CLR命名来在运行时访问generics类型:

 AssemblyContaingMyClass.GetType("MyNameSpace.MyClass`1"); 

在CLR中,generics的命名没有提到类型参数,但是后缀( ` )后跟generics类型参数的数量。

这就是你追求的吗?

  public class MyClass { public T TheGeneric { get; set; } } Type theType = typeof(MyClass<>); 

你不能这样做的原因是,简单地说,没有名为MyClass类。 有通用类定义,其名称类似于MyClass`1 ,然后有类型的每个变体,其名称看起来像MyClass`1[System.String]等。

获取类型的最简单方法是使用typeof关键字,如下所示:

 var genericType = typeof(MyClass<>); var specificType = typeof(MyClass); 

但是,如果必须通过名称从程序集加载它,则需要提供如下所示的全名:

 var genericType = assembly.GetType("MyClass`1"); var specificType = assembly.GetType("MyClass`1[System.String]"); 

当涉及到generics类型的命名时,它的ClassName`

尝试(没有T):

 Type template = typeof(MyNameSpace.MyClass<>);