2010-07-01 53 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

相关问题