タイプがクラスであるアセンブリからタイプのコレクションを取得する次のコードがあります。
Assembly assembly = Assembly.LoadFile(DLLFile);
var types = assembly.GetTypes().AsEnumerable().Where(x => x.IsClass);
これは正常に動作し、期待どおりです。ただし、ラムダ式をLinq Expression変数に引き出したいと思いました(後でこのメソッドのパラメーターで使用されるため)。だから私は次のことをしました:
private Expression<Func<Type, bool>> _standardFilter = (x => x.IsClass);
Assembly assembly = Assembly.LoadFile(DLLFile);
var types = assembly.GetTypes().AsEnumerable().Where(_standardFilter);
ただし、これはエラーでコンパイルされません:
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
私の式が predicateSystem.Func<TSource,int,bool>
に準拠していないことは理解していますが、Where
関数には の述語を取るオーバーロードがありSystem.Func<TSource,bool>
、私が知る限り、これは機能するはずです。
assembly.GetTypes()
(配列である)の結果をいくつかの方法でリストに変換しようとしましたが、問題は解決しませんでした。
また、このクラスのすべてのステートメントが正しいことを確認しusing
ました。これは、グーグル中に何人かの人々が遭遇する問題のようです。
過去に、コレクションでこの同じ手法を使用することができましたが、関数がコレクションで使用可能であり、提供している述語を受け入れる必要があるIQueryable
場合に、これが機能しない理由がわかりません。Where
IEnumerable
ご協力いただきありがとうございます。