2010-04-05 5 views
50

Если у меня есть метод подпись, какКак получить имя типа аргумента общего типа?

public string myMethod<T>(...) 

Как я могу, внутри метода, получить имя типа, которое было дано в качестве аргумента типа? Я хотел бы сделать что-то похожее на typeof(T).FullName, но это действительно работает ...

+5

'typeof (T) .FullName' * необходимо * работа. Что происходит вместо этого? –

+0

Я получил ошибки компилятора в этом утверждении, но, видимо, они были вызваны чем-то другим, потому что теперь он работает. Благодаря! –

ответ

79

Ваш код должен работать. typeof(T).FullName совершенно применим. Это полностью компилирование, действующая программа:

using System; 

class Program 
{ 
    public static string MyMethod<T>() 
    { 
     return typeof(T).FullName; 
    } 
    static void Main(string[] args) 
    { 

     Console.WriteLine(MyMethod<int>()); 

     Console.ReadKey(); 
    } 

} 

Выполнение вышеуказанных отпечатков (как и ожидалось):

System.Int32 
+0

Обязательно проверьте его с помощью MyMethod >() и посмотрите, что вы получаете ... вам нужно учитывать типы с нулевым значением, если вам нужен базовый тип в этом сценарии. – GR7

+1

Вы имеете в виду «' '' Если это так, это работает, но вы получаете 'System.Nullable ' (в синтаксисе полного имени), что и следовало ожидать ... –

+0

Хотя у меня уже было решение (хотя это не сработало по какой-то причине ...), я дам вам очки для написания наилучшего ответа far =) –

1

Если у вас есть некоторые экземпляр T доступны, это не отличается от любого другого типа.

var t = new T(); 

var name = t.GetType().FullName; 
+1

Вам даже не нужен экземпляр T .... typeof (T) отлично работает без экземпляра ... Ваши данные будут отличаться от поведения, если подкласс передан в метод (в качестве аргумента). –

+1

проблема с этим кодом заключается в том, что если T не имеет конструктора без параметров, то это не сработает. –

+0

@Nathan - это был просто пример, показывающий получение экземпляра T. Предположительно на общий метод у него будет доступный тип T. @Reed - вы, конечно, правы, я предположил, что это то, чем он был. – womp

2

TypeOf (T) .Name и TypeOf (T) .FullName работают для меня ... Я получаю тип, передаваемый в качестве аргумента.

+1

ах. Если тип, который вы передали, является Nullable, для получения базового типа вам нужно использовать что-то вроде typeof (T) .GetGenericArguments() [0] – GR7

+0

, чтобы проверить, является ли тип с нулевым значением, вы должны использовать typeof (T). IsGenericType, и если это так, вы должны использовать следующее, чтобы получить Имя или FUllName ((Тип) typeof (T) .GetGenericArguments() [0]). – GR7

Смежные вопросы