2016-06-23 36 views
1

我們有一個List<SomeType>,希望能夠對其執行不同的操作,例如選擇符合某些條件的元素。我們希望這些測試由用戶以文本形式提供,因此請查看C# Expression Evaluator使用C#表達式評估器來過濾列表

它當然可以用於此目的,但我很努力判斷在使用LINQ時是否可以將csharpeval代表用作lambda。我們希望將存儲的表達式應用於每個對象。

例如只需要"o.FirstName == "Tom"而不是存儲整個列表表達式,如list.Where(o => o.FirstName == 'Tom')

通過ScopeCompile提供一次編譯表達式並針對不同輸入數據運行的方法,但我不確定它們是否與lambda方法兼容。誰能幫我嗎?

+0

您是否已經直接調查過使用Roslyn? https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples#expr – user9993

+0

@ user9993否,雖然他們的示例「創建和構建C#腳本並多次執行」看起來非常相似。顯然我可以寫一個明確的循環,lambda主要是爲了風格:) –

+1

http://stackoverflow.com/q/1707854/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 

您可以創建一個輔助函數來創建lambda函數:

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();