7

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

using System.Collections.Generic;

namespace MyNameSpace
{
    public class MyClass<T> : 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)与泛型类一起使用是否违法?

您能否建议任何替代方法来在运行时获取泛型类的类型?

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

编辑 :

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

4

4 回答 4

10

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

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

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

于 2013-07-11T09:24:14.537 回答
4

您不能这样做的原因是,简单地说,没有名为 的类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>

于 2013-07-11T09:34:53.303 回答
2

这就是你所追求的吗?

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


    Type theType = typeof(MyClass<>);
于 2013-07-11T09:25:05.200 回答
0

尝试(没有 T):

Type template = typeof(MyNameSpace.MyClass<>);
于 2013-07-11T09:24:16.990 回答