Как мне отразить имя Типа, предоставленное как универсальный? - PullRequest
3 голосов
/ 01 июля 2010

Как отразить обратно имя типа, который предоставляется в качестве универсального параметра?Мне бы очень хотелось узнать, как это делается в 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 ]

16 голосов
/ 01 июля 2010

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 # 1012 * и VB.NET GetType(T) возвращают System.Type объект, который имеет свойства и методы для получения информации о конкретном Type.По умолчанию метод System.Type .ToString() возвращает полное имя типа.Чтобы вернуть только Name типа, вызовите typeof(T).Name или GetType(T).Name в C # или VB.NET соответственно.

5 голосов
/ 01 июля 2010

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 From Target Type: True

Передача экземпляра Введите Y в качестве параметра:
TypeOf T: ConsoleApplication2. TypeX
Тип цели: ConsoleApplication2. ТипY
T IsAssignable From Target Type: True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...