Type と Expression (TDeligate なし) を受け取るクラスがあります。Expression が : に基づいていることは知ってExpression<Func<T, bool>>
いますが、T
. 代わりに、Type
. 必要なのは、リストに対して式を実行し、結果のサブリストを返すことです。のようなものlist.Where(Expression)
。メソッドは次のとおりです。
public IEnumerable Query(Type type, Expression exp) {
var list = GetListByType(type);
return list.Where(exp); // << How do I make this happen?
}
編集#1
次のように、(ウィリアムが提案したように) Expression を LambdaExpression に変換することができました。
var d = Expression.Lambda(exp).Compile();
今私の問題はこれです:d
上記はFunc<Category, bool>
(どこCategory
にあるT
)に評価されます。今、これを実行しようとするとreturn list.Where(d);
、コンパイラは次のように言います。
型引数は使用法から推測できません。型引数を明示的に指定してみてください。
問題は、持っていないのでd
キャストできないことです。
冒頭で述べたように、私は を持っていません。への
キャストも機能しませんでした。Func<T, bool>
T
T
typeof(T)
d
Func<object, bool>
これを解決する方法はありますか?
d
に対して実際に実行するにはどうすればよいlist
ですか?
編集#2(回避策/解決策)
最終的に、問題を解決するためにいくつかの CodeDom を生成することになりました。
誰かがもっときれいな解決策を見つけたら、ぜひ聞いてみたいです。