Как программно получить имя универсального класса?

1

Я хочу динамически получить имя класса. Я могу использовать это:

public void RequestData<TResult>()
{
     var myName = typeof(TResult).Name;
}

Что отлично работает, например, если TResult имеет тип MyClass тогда myName будет равно "MyClass"

Но если TResult имеет тип

List<MyClass> 

Я все еще хочу, чтобы myName равнялся "MyClass"... на данный момент это будет "List'1"

Итак, если TResult будет иметь тип List как я могу программно узнать, что это List а затем выбрать имя типа этого списка?

Теги:
generics

3 ответа

3
Лучший ответ

Это можно сделать с помощью нескольких методов в Type.

public void RequestData<TResult>()
{
    Type type = typeof(TResult);
    string myName;
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
    {
        myName = type.GetGenericArguments()[0].Name;
    }
    else
    {
        myName = typeof(TResult).Name;
    }
}
2

Вы можете получить "самый левый" внутренний общий тип с помощью

public static Type GetInnermost(Type t)
{
    while(t.IsGenericType)
    {
        t = t.GetGenericArguments()[0];
    }
    return t;
}

то вы можете сделать:

var myName = GetInnermost(typeof(TResult)).Name;

затем, например,

RequestData<List<IEnumerable<Task<IObserverable<string>>>();

будет иметь имя String.

  • 0
    +1 за лучшее решение imho.
1

Вы можете использовать метод GetGenericArguments, который returns an array of Type objects that represent the type arguments of a generic type or the type parameters of a generic type definition. (MSDN).

Для образца:

public void RequestData<TResult>()
{
     var myName = typeof(TResult).Name;
     var type = typeof(TResult)
     if (type.IsGenericType)
     {
         myName = type.GetGenericArguments().First().Name;
     }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню