我想动态获取类的名称。我可以用这个:
public void RequestData<TResult>()
{
var myName = typeof(TResult).Name;
}
哪种方法很好,例如如果TResult
的类型为MyClass
,那么myName
将等于"MyClass"
但如果TResult属于
类型List<MyClass>
我仍然希望myName等于&#34; MyClass&#34; ......目前它将是&#34; List`1&#34;
因此,如果TResult
类型为List
,我怎样才能以编程方式知道它是List
然后选择此列表类型的名称?
答案 0 :(得分: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;
}
}
答案 1 :(得分:2)
你可以得到最左边的&#39;内部泛型类型
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
。
答案 2 :(得分:1)
您可以使用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)。{/ p>的GetGenericArguments
方法
样本:
public void RequestData<TResult>()
{
var myName = typeof(TResult).Name;
var type = typeof(TResult)
if (type.IsGenericType)
{
myName = type.GetGenericArguments().First().Name;
}
}