簡體   English   中英

C#-如何在運行時獲取“帶有通用參數的類”的Type?

[英]C# - How do I GetType of 'class with generic parameter' in run-time?

我有一個通用類,如下所示:

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的程序集將在運行時加載。

我認為您必須在運行時使用CLR命名來訪問通用類型:

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

在CLR中,泛型的命名沒有提及類型參數,而是帶有backtick( ` ),后跟泛型類型參數的數量。

這是你所追求的嗎?

    public class MyClass<T>
    {
        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<string>);

但是,如果必須從裝配件中按其名稱加載它,則需要提供全名,如下所示:

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

泛型類型的命名是ClassName`<number of generic arguments>

試試(不帶T):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM