2010-07-01 36 views
3

如何反映作爲泛型參數提供的類型的名稱?我真的很想知道這是如何在C#和VB.NET中完成的。請參閱以下示例代碼和預期響應。如何反映作爲通用提供的類型的名稱?

在C#:

public void Test<T>() 
{ 
    Console.WriteLine("The supplied type is {0}",???) 
} 

在VB.NET

Public Sub Test(Of T)() 
    Console.WriteLine("The supplied type is {0}",???) 
End Sub 

執行Test<String>()Test(Of String)()應該產生:

 
The supplied type is String 

回答

16

C#(typeof操作者):

public void Test<T>() 
{ 
    Console.WriteLine("The supplied type is {0}", typeof(T)); 
} 

VB.NET(GetType運營商):的typeof(T)

Public Sub Test(Of T)() 
    Console.WriteLine("The supplied type is {0}", GetType(T)) 
End Sub 

C#和VB.NET的GetType(T)回報System.Type對象具有屬性並檢索有關特定Type信息的方法。默認情況下,System.Type.ToString()方法將返回該類型的完全限定名稱。要僅返回該類型的Name,請分別在C#或VB.NET中調用typeof(T).NameGetType(T).Name

+0

+1了確切的答案的OP是:-P – STW 2010-07-01 20:14:25

+0

感謝您的回答後!這幫助我開始了。我在'System.Type'附加了一些附加信息,以便其他人知道它實際上是一個具有屬性和方法的第一類對象。如果我添加了任何不正確的東西,請隨意編輯它。 – 2010-07-01 20:38:34

5

Darin的答案是正確的,但它也是值得注意的是,如果您收到的T實例作爲參數,你可以使用.GetType()還有:

public void Test<T>(T target) 
{ 
    Console.WriteLine("The supplied type is {0}", target.GetType()); 
} 

只是一種不同的方法(typeof將檢查類型參數.GetType()一起使用類型的實例)。


由於丹尼爾在評論中指出存在細微差別來考慮:typeof(T)將返回類型參數的類型,而.GetType()將返回對象的確切類型 - 這可能T繼承typeof(T).IsAssignableFrom(target.GetType())可能會返回true - 但具體的具體類型可能會有所不同。

一個例子:

using System; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     GenericClass<TypeX>.GenericMethod(new TypeX()); 
     GenericClass<TypeX>.GenericMethod(new TypeY()); 
     Console.ReadKey(); 
    } 
    } 

    public class TypeX {} 

    public class TypeY : TypeX {} 

    public static class GenericClass<T> 
    { 
    public static void GenericMethod(T target) 
    { 
     Console.WriteLine("TypeOf T: " + typeof(T).FullName); 
     Console.WriteLine("Target Type: " + target.GetType().FullName); 
     Console.WriteLine("T IsAssignable From Target Type: " + typeof(T).IsAssignableFrom(target.GetType())); 
    } 
    } 
} 

結果輸出:

而TYPEx實例傳遞作爲參數:
TypeOf運算T:ConsoleApplication2。 TypeX
目標類型:ConsoleApplication2。而TYPEx
ŤIsAssignable從目標類型:真

傳遞鍵入y作爲參數的實例:
TypeOf運算T:ConsoleApplication2。 TypeX
目標類型:ConsoleApplication2。 鍵入y
牛逼IsAs​​signable從目標類型:真

+5

注意'typeof(T)'將返回指定的類型參數,而'target.GetType()'將返回提供的參數的實際類型 - 這可以是'T',也可以是'T'的每個子類型。進一步'target.GetType()'可能會導致'NullReferenceException'。 – 2010-07-01 19:46:13

+0

我不認爲這個答案值得負面觀點。他解釋了不同方法正在發生的事情,這種方法可能是一個有效的做法。很明顯,調用GetType()也會導致null ref異常,這並不值得一提。 – 2010-07-01 19:48:50

+0

丹尼爾的權利...雖然我不知道爲什麼提供有用信息的答案會收到downvote ... – 2010-07-01 19:48:52

相關問題