C#-如何获取';具有泛型参数的类';在运行时

本文关键字:参数 泛型 运行时 获取 何获取 C#- | 更新日期: 2023-09-27 18:22:00

我有一个通用类,如下所示:

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

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

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

Assembly.GetType(className)与泛型类一起使用是否违法?

您能建议其他方法在运行时获取泛型类的类型吗?

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

编辑:

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

C#-如何获取';具有泛型参数的类';在运行时

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

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

在CLR中,泛型的命名没有提及类型参数,但后面有一个反勾号(`),后面跟着泛型类型参数的数量。

不能这样做的原因是,简单地说,没有名为MyClass的类。有一个通用类定义,它的名称有点像MyClass`1,还有类型的每一个变体,它的名字看起来像MyClass`1[System.String]等等。

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

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

但是,如果您必须按其名称从程序集中加载它,则需要提供全名,如下所示:

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

当涉及到泛型类型的命名时,它是ClassName`<number of generic arguments>

这就是你想要的吗?

    public class MyClass<T>
    {
        public T TheGeneric { get; set; }
    }

    Type theType = typeof(MyClass<>);

try(无T):

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