我遇到System.Collections.Generic.IEnumerable'1[MyClass]
我的表达式返回null
,但它不应该:
myCustomList.Where(x => x.bType != null && x.bType is
IEnumerable<T>).FirstOrDefault();
我的AddWatch向我展示:
T
:System.Collections.Generic.List<MyClass>
x.bType
:
{System.Collections.Generic.IEnumerable'1[MyClass]}
和dynamic
{System.RuntimeType}
作为Type
x.bType is IEnumerable<T>
返回false
。x.bType != null
返回true
。 x.bType
是一个属性,通常值为typeof(IEnumerable<MyClass>))
。
已更新
我将表达式更改为...x.bType == typeof(IEnumerable<T>)..
。
x.bType
以红色{System.Collections.Generic.IEnumerable'1[MyClass]}
显示,他似乎无法将List<MyClass>
转换为IEnumerable<MyClass>
? ,因为我看到x.bType
,System.InvalidOperationException
和x.bType.DeclaringMethod
x.bType.GenericParameterAttributes
)x.bType.GenericParameterPosition
我做错了什么?
SOLUTION:
感谢所有人,尤其感谢@Wilko van der Veen,这解决了我的问题:x.bType.IsAssignableFrom(typeof(T))
,但也许有一个没有反思的解决方案,因为在我的情况下,重新感觉不是那么高效?!
答案 0 :(得分:2)
您可以通过反射检查某个类是否实现了某个接口:
list.Where(l =&gt; l.GetType()。IsAssignableFrom(typeof(IEnumerable&lt;&gt;))
检查类型是否可从通用IEnumerable类分配。
答案 1 :(得分:0)
您无法使用is检查类型。你必须使用btype == typeof(...)
x.bType == typeof(IEnumerable<T>)
修改强> 哦,刚才意识到,因为你的T是typeof(System.Collections.Generic.List),这不行。 无法更改设置bType的部分 btype = typeof(列表) 至 btype = typeof(IEnumerable) 和表达 - 部分的类型检查 x.btype == typeof(T)
完整的表达式如下所示:
myCustomList.Where(x => x.bType != null && x.bType == typeof(T)).FirstOrDefault()
EDIT2:该死的抱歉,我需要更多的咖啡,所以忘记斜体(也许我稍后会删除)。我在考虑你的Generic T。
我的意思是: 不可能,用IEnumerable的通用T来检查而不是List