如何反映作为通用提供的Type的名称?

时间:2010-07-01 19:38:28

标签: c# .net vb.net generics reflection

如何反映作为通用参数提供的类型的名称?我真的想知道在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

2 个答案:

答案 0 :(得分:16)

C#(typeof运营商):

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

VB.NET(GetType运算符):

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

C#的typeof(T)和VB.NET的GetType(T)返回一个System.Type对象,该对象具有用于检索有关特定Type的信息的属性和方法。默认情况下,System.Type的{​​{1}}方法将返回Type的完全限定名称。要仅返回类型的.ToString(),请分别在C#或VB.NET中调用Nametypeof(T).Name

答案 1 :(得分: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
T IsAssignable来自目标类型:True

传入 TypeY 的实例作为参数:
TypeOf T:ConsoleApplication2。 TypeX
目标类型:ConsoleApplication2。 TypeY
T IsAssignable来自目标类型:True