【问题标题】:C# - How do I GetType of 'class with generic parameter' in run-time?C# - 如何在运行时获取“具有泛型参数的类”的类型?
【发布时间】:2013-07-11 18:04:22
【问题描述】:

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

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 的程序集将在运行时加载。

【问题讨论】:

  • 试用MyNameSpace.MyClass&lt;&gt;
  • 我做到了。也试过 MyNameSpace.MyClass

标签: c#


【解决方案1】:

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

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

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

【讨论】:

  • +1。并且不难检查,类型的全名(来自同一个程序集)可以通过typeof(MyNameSpace.MyClass&lt;&gt;).FullName 提取。据我记得,其他程序集的全名符合AssemblyName+NameSpace.ClassName`3(用于3个通用参数)
  • +1。它的工作就像魔术一样!!!非常感谢 :) 顺便说一句,在调试器中它说我的类名是“ MyClass`1 ”。这是正常现象还是有错误?
  • @someone_smiley - 是的,这很正常。
  • 希望我能多投一次,谢谢@Damien_The_Unbeliever
【解决方案2】:

您不能这样做的原因是,简单地说,没有名为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`&lt;number of generic arguments&gt;

【讨论】:

    【解决方案3】:

    这就是你所追求的吗?

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

    【讨论】:

      【解决方案4】:

      尝试(不带 T):

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

      【讨论】:

      • 我不能:包含我的类的程序集将在运行时加载。
      猜你喜欢
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多