我有一个采用泛型参数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()调用仅返回顶级接口,因此您需要浏览每个接口实现的所有接口(递归),以检查这些接口.丑陋,我知道.
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |