Я хочу динамически получить имя класса. Я могу использовать это:
public void RequestData<TResult>()
{
var myName = typeof(TResult).Name;
}
Что отлично работает, например, если TResult
имеет тип MyClass
тогда myName
будет равно "MyClass"
Но если TResult имеет тип
List<MyClass>
Я все еще хочу, чтобы myName равнялся "MyClass"... на данный момент это будет "List'1"
Итак, если TResult
будет иметь тип List
как я могу программно узнать, что это List
а затем выбрать имя типа этого списка?
Это можно сделать с помощью нескольких методов в 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;
}
}
Вы можете получить "самый левый" внутренний общий тип с помощью
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
.
Вы можете использовать метод 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;
}
}