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

Ben*_*ack 3 .net c# vb.net generics reflection

如何反映作为通用参数提供的类型的名称?我真的想知道在C#和VB.NET中是如何完成的.请参阅以下示例代码和预期响应.

在C#中:

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

在VB.NET中

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

执行Test<String>()Test(Of String)()应该产生:

The supplied type is String

Dar*_*rov 16

C#(typeof运算符):

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

VB.NET(GetType运算符):

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

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


STW*_*STW 5

达林的回答是正确的,但值得注意的是,如果你收到T一个参数实例,你也可以使用.GetType():

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

只是一种不同的方法(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()));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

结果输出:

传入TypeX的实例作为参数:
TypeOf T:ConsoleApplication2.TypeX
目标类型:ConsoleApplication2.TypeX
T IsAssignable From Target Type:True

传入TypeY的实例作为参数:
TypeOf T:ConsoleApplication2.TypeX
目标类型:ConsoleApplication2.TypeY
T IsAssignable From Target Type:True

  • 注意`typeof(T)`将返回指定的类型参数,而`target.GetType()`将返回所提供参数的实际类型 - 这可以是`T`,也可以是`T`的每个子类型.进一步`target.GetType()`可能会导致`NullReferenceException`. (5认同)