我的通用类型是列表,还是只是一个项目?

rea*_*Jim 5 c# generics

我有一个采用泛型参数T的方法.在内部,要确定要调用的其他方法,我需要知道(不限制它)该参数是List还是只是某些东西.

我怎么做?

我一直在用

var isList = typeof(T).Name.ToLower().Contains("list`1");
Run Code Online (Sandbox Code Playgroud)

但这感觉就像一个肮脏的方法.什么更干净?

Dan*_*ant 11

var type = typeof(T);
bool isList = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>);
Run Code Online (Sandbox Code Playgroud)

如果您不需要List的完全匹配,您也可以检查是否typeof(IList).IsAssignableFrom(typeof(T))有许多类似列表的集合实现.


如果你想支持T等于IList<T2>直接(所以类型参数T是一个接口),那么你需要单独检查它(GetGenericTypeDefinition()也可以返回typeof(IList<>)).

如果你想支持任何继承自任何类型的T IList<>,那么你必须更有创意.您必须枚举所有接口,检查它们是否是通用的(如上所述),然后检查接口的泛型类型IList<>.此外,由于对Type的GetInterfaces()调用仅返回顶级接口,因此您需要浏览每个接口实现的所有接口(递归),以检查这些接口.丑陋,我知道.