2016-06-23 9 views
1

私たちはList<SomeType>を持っていて、いくつかの基準を満たす要素を選択するのと同じように異なるアクションを実行できるようにしたい。我々はこれらのテストをテキストでユーザに提供したいので、C# Expression Evaluatorを見ています。リストをフィルタリングするためにC#Expression Evaluatorを使用する

これは確かにこの目的のために使用できますが、LINQを使用するときにcsharpevalデリゲートをラムダとして使用できるかどうかを判断するのは難しいです。私たちは、格納された式を各オブジェクトに適用する必要があります。

"o.FirstName == "Tom"はのようにリスト全体の表現を格納しません。

式を一度コンパイルして異なる入力データに対して実行する方法は、ScopeCompileから提供されていますが、これらがラムダメソッドと互換性があるかどうかはわかりません。誰か助けてくれますか?

+0

このためにRoslynを直接使用しましたか? "C#スクリプトを作成してビルドして複数回実行する"の例はかなり似ていますが、https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples#expr – user9993

+0

@ user9993はありません。明らかに私は明示的なループを書くことができます、ラムダは主にスタイルのためです: –

+1

http://stackoverflow.com/q/1807854/1271037、http://stackoverflow.com/q/821365/1271037 – dovid

答えて

2

私はこれが何をしたいです:

var expression = new CompiledExpression<bool>("MyProperty > 10"); 
var func = expression.ScopeCompile<MyClass>(); 

使用例:

class MyClass 
{ 
    public int MyProperty { get; set; } 
} 
var list = Enumerable.Range(1, 50).Select(x => new MyClass { MyProperty = x }); 

var expression = new CompiledExpression<bool>("MyProperty > 10"); 
var func = expression.ScopeCompile<MyClass>(); 

var filtered = list.Where(p => func(p)); 

Console.WriteLine(filtered.Count()); //40 

あなたはラムダ関数を作成するヘルパー関数を作成することができます。

Func<T, bool> GetLambda<T>(string inputExp) 
{ 
    var expression = new CompiledExpression<bool>(inputExp); 
    return expression.ScopeCompile<T>(); 
} 

使用法:

var func = GetLambda<People>("Id < 5"); 
Peoples.Where(p => func(p)).Dump(); 
関連する問題