2013-07-11 53 views
3

我有一個泛型類,如下圖所示:C# - 如何在運行時GetType的類與泛型參數?

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

+0

嘗試'MyNameSpace.MyClass <>' – sll

+0

我做過。也試過MyNameSpace.MyClass

回答

5

我認爲你必須使用CLR的命名,在運行時訪問泛型類型:

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

在CLR中,仿製藥的命名不提類型參數,但隨後數的反引號(`)泛型類型參數。

+1

+1。而且不難檢查,類型的全名(來自同一個程序集)可以通過'typeof(MyNameSpace.MyClass <>)。FullName'來提取。據我記得,其他程序集具有全名'AssemblyName + NameSpace.ClassName \'3'(用於3個通用參數) –

+0

+1。它的工作像魔術一樣!非常感謝:)順便說一句,在調試器中,它說我的班級名稱是「MyClass'1」。這是正常的還是有錯誤的? –

+0

@someone_smiley - 是的,這很正常。 –

0

嘗試(不含T):

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

我不能:包含我的類的程序集將在運行時加載。 –

2

這是你所追求的?

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


    Type theType = typeof(MyClass<>); 
+1

我想操作系統想從字符串中獲取類型... –

1

你不能這樣做的原因是,簡單地說,沒有類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]"); 

當涉及到泛型類型是的命名