2

タイプがクラスであるアセンブリからタイプのコレクションを取得する次のコードがあります。

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場合に、これが機能しない理由がわかりません。WhereIEnumerable

ご協力いただきありがとうございます。

4

3 に答える 3

5

式を実行可能なコード (デリゲート) にコンパイルします。

var types = assembly.GetTypes().AsEnumerable().Where(_standardFilter.Compile());

@Kirk が述べたように、分析しない場合は、式ツリーを使用しない方がよいでしょう。type の filter を使用するだけFunc<Type, bool>です。

于 2013-06-25T16:10:13.950 に答える
3

Enumerable 拡張メソッドは Expression ではなく Func を取ることに注意してください。したがって、引数の入力が間違っています。

これは、単純な Func ではなく Expression<Func> を取る Entity Framework とは対照的です。

したがって、メソッド シグネチャに注意してください。それらは似ており、同じラムダで両方を呼び出すことができますが、実際には異なります!

その背後にある理由は、EF が Expression を検査して SQL コードに変換するのに対し、Linq to Object はメモリ内で述語を実行するだけだからです。

于 2013-06-25T16:17:26.570 に答える
0

代わりにこれを試すことができます:

private Func<Type, bool> standardFilter;
standardFilter = (type) => {
    return type.IsClass;
};

var types = assembly.GetTypes().AsEnumerable().Any(x => standardFilter(x));

その後、standardFilter の実装を自由に変更できます。Type を取り、それを含める必要があるかどうかについて bool を返す限り、モジュールのままであり、目的を達成することができます。

于 2013-06-25T16:17:02.307 に答える