如何以编程方式获得泛型类的名称?
本文关键字:泛型类 编程 方式获 | 更新日期: 2023-09-27 18:04:41
我想动态地获得一个类的名称。我可以这样写:
public void RequestData<TResult>()
{
var myName = typeof(TResult).Name;
}
可以正常工作,例如,如果TResult
是MyClass
类型,那么myName
将等于"MyClass"
但是如果result的类型是
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;
}
}