我有下面的代码从大会获得类型的集合,其中的类型是类:错误使用LINQ表达式变量,而不是lambda表达式时,直接
Assembly assembly = Assembly.LoadFile(DLLFile);
var types = assembly.GetTypes().AsEnumerable().Where(x => x.IsClass);
这工作正常,并符合市场预期。然而,我想将lambda表达式拉出到Linq Expression变量中(后面将在此方法的参数中使用它)。所以,我做了以下内容:
System.Collections.Generic.IEnumerable<System.Type>' does not contain a
definition for 'Where' and the best extension method overload
'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' has some invalid arguments
我明白,我表达不符合谓词System.Func<TSource,int,bool>
,但是Where
功能有:
private Expression<Func<Type, bool>> _standardFilter = (x => x.IsClass);
Assembly assembly = Assembly.LoadFile(DLLFile);
var types = assembly.GetTypes().AsEnumerable().Where(_standardFilter);
但是这不会有错误编译超载,需要一个谓词System.Func<TSource,bool>
,据我所知可以工作。
我已经尝试将assembly.GetTypes()
(这是一个数组)的结果以几种方式转换为列表,而没有它帮助解决问题。
我也确定我已经得到了这个类的所有正确的using
声明,因为这似乎是几个人在我的谷歌搜索过程中遇到的问题。
在过去,我已经成功地使用同样的技术在IQueryable
集合,但我不明白为什么当Where
功能可在IEnumerable
收集这是不行的,应该接受我提供的谓词。
非常感谢您的帮助。
'表达>'和'功能<...>'是不一样的东西。 –
voithos
'IQueryable'上的'Where'扩展方法接受'Expression >',这就是为什么你以前能够做到这一点。这允许像EF这样的东西传入一个表达式并在以后进行编译。但在'IEnumerable '上,它只接受'>'。 –
因此,再次归结为我不注意到一个特定的词!我真的应该退后一步,多关注我所设想的事情! – XN16