2013-05-31 66 views
3

我需要解析的字符串,併產生一個謂詞(或表達,我不打擾)其中字符串的形式如下:解析串以產生謂詞

「> 30」

我想而不是寫我自己的,有幾個庫做這樣的東西 - 我試過FLEE和NCalc,但他們似乎需要字符串採取「a> 30」的形式,並提供'a'作爲參數的值。

有沒有可以讓我喜歡寫東西

Func<int, bool> predicate = parser.Parse("> 30"); 

bool a = predicate(10); // false 
bool b = predicate(40); // true 

我需要一個像<運營商庫,> =,等等,以及OR和和支持。這不僅僅是我正在使用的數字,字符串和枚舉也在混合中。

+0

什麼會是謂語相當於?寫起來也很容易。 –

+0

@newStackExchangeInstance我在問題 – RichK

+0

中添加了一個示例如果您告訴我您需要的符號是什麼,以及是否需要帶小數點或整數的數字,我可以編寫它。 –

回答

8

您可以使用動態Linq庫ScottGu已經博客瞭解。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx

是否應該讓你做的東西像下面這樣。

const string exp = "variable > 30"; 
var p = Expression.Parameter(typeof(int), "variable"); 
var e = DynamicExpression.ParseLambda(new[] { p }, null, exp); 


bool a = (bool)e.Compile().DynamicInvoke(20); 
bool b = (bool)e.Compile().DynamicInvoke(40); 

Func<int, bool> predicate = (Func<int, bool>)e.Compile(); 
bool a = predicate(20); 
bool b = predicate(40); 
+0

這很酷,我會給它一個去 – RichK

+0

對不起...在我的例子中修正了一個錯字,因爲結果是LambdaExpressions。不知道這對你是否仍然有用。 –

+0

@EoinCampbell我更新了你的答案。如果您不喜歡,請隨時恢復。 – I4V