在我的lambda表达式

时间:2016-04-08 06:25:26

标签: c# linq generics lambda

我遇到System.Collections.Generic.IEnumerable'1[MyClass]

的问题

我的表达式返回null,但它不应该:

  • myCustomList.Where(x => x.bType != null && x.bType is IEnumerable<T>).FirstOrDefault();

我的AddWatch向我展示:

  • TSystem.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.bTypeSystem.InvalidOperationExceptionx.bType.DeclaringMethod

(如果我打开x.bType.GenericParameterAttributesx.bType.GenericParameterPosition

我做错了什么?

SOLUTION:

感谢所有人,尤其感谢@Wilko van der Veen,这解决了我的问题:x.bType.IsAssignableFrom(typeof(T)),但也许有一个没有反思的解决方案,因为在我的情况下,重新感觉不是那么高效?!

2 个答案:

答案 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