【问题标题】:Type is System.Collections.Generic.IEnumerable'1[MyClass] in my lambda expression在我的 lambda 表达式中,类型是 System.Collections.Generic.IEnumerable'1[MyClass]
【发布时间】:2016-04-08 06:25:25
【问题描述】:

System.Collections.Generic.IEnumerable'1[MyClass] 有问题

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

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

我的 AddWatch 显示:

  • 对于TSystem.Collections.Generic.List&lt;MyClass&gt;
  • 对于x.bType{System.Collections.Generic.IEnumerable'1[MyClass]}dynamic {System.RuntimeType} 作为 Type
  • x.bType is IEnumerable&lt;T&gt; 返回false
  • x.bType != null 返回true

x.bType 是一个属性,通常具有typeof(IEnumerable&lt;MyClass&gt;)) 的值。

更新

我把表情改成了...x.bType == typeof(IEnumerable&lt;T&gt;)..

x.bType 显示为红色,{System.Collections.Generic.IEnumerable'1[MyClass]} 似乎无法将List&lt;MyClass&gt; 转换为IEnumerable&lt;MyClass&gt;?! ,因为我看到一个(如果我打开x.bTypeSystem.InvalidOperationExceptionx.bType.DeclaringMethodx.bType.GenericParameterAttributesx.bType.GenericParameterPosition

我做错了什么?

解决方案:

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

【问题讨论】:

  • 至少显示 bType 是如何设置的。
  • 注意:System.Collections.Generic.IEnumerable'1[MyClass] 是一个字符串,是ToString() 方法的结果,在IEnumerable&lt;MyClass&gt; 类型上调用(调试器调用它来显示有关变量的信息)。所以真实的是System.Collections.Generic.IEnumerable&lt;MyClass&gt;
  • @Henk Holterman bType =typeof(IEnumerable&lt;MyClass&gt;)。感谢您的帮助
  • 您必须创建一个minimal reproducible example
  • 更新了我的帖子,请再看一遍

标签: c# linq generics lambda


【解决方案1】:

可以通过反射检查某个类是否实现了某个接口:

list.Where(l => l.GetType().IsAssignableFrom(typeof(IEnumerable))

这会检查类型是否可以从通用 IEnumerable 类中分配。

【讨论】:

  • 谢谢,解决了x.bType.IsAssignableFrom(typeof(T))
【解决方案2】:

你不能用 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:该死的对不起,我需要更多的咖啡,所以忘记斜体部分(也许我稍后会删除)。我在考虑你的通用 T。

我的真正意思是: 不可能,用 IEnumerable 的通用 T 而不是 List 进行检查

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 2018-10-09
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多