2014-04-28 17 views
0

我想將一個方法內部的邏輯轉換爲一個表達式,以便我可以存儲它,並在需要時可以編譯它執行。寫一個方法體作爲表達式<>

該方法已流等

1)發生在一個集合屬性的參數

2)做了「FirstOrDefault」在參數

3)通過調用一些方法上的存儲庫類

4)一些如果一些字段的條件

5)創建/實例化

等等在所有複雜的方法,它做很多事情。

問:是否有任何文章/資源可以通過示例向我展示這一點。

謝謝

+0

爲什麼需要成爲一個'Expression'?你不能把它作爲一種方法嗎? –

+0

@ Sriram,它已經是一種方法,但團隊中有一些指針將其作爲表達式,以便它充當數據結構而不是代碼。 –

+0

@Prera​​kK你應該真的問爲什麼這很重要。通常最好將代碼作爲代碼而不是數據 - 如果你打算在運行時修改它,或者如果你需要做一些你不能做的事情,那麼你只是真的想要代碼作爲數據 - 而且經常,除非你真的關心性能,否則最好還是考慮一個不同的方法(存儲庫字典?依賴注入?)。這對你來說是什麼? :) – Luaan

回答

1

MSDN有什麼問題?你可以(在頁面的底部)在這裏找到例子: http://msdn.microsoft.com/en-us/library/bb397951.aspx

事情是這樣的:

static Expression<Action<IEnumerable<int>>> BuildExpression() 
{ 
    ParameterExpression param1 = Expression.Parameter(typeof(IEnumerable<int>), "param1"); 
    Expression<Func<IEnumerable<int>, int>> firstOrDefault = collection => collection.FirstOrDefault(); 
    Expression body = Expression.Condition(
     Expression.LessThan(
      Expression.Invoke(firstOrDefault, param1), 
      Expression.Constant(10)), 
     Expression.Call(
      typeof(Console).GetMethod("WriteLine", new [] { typeof(string) }), 
      Expression.Constant("Less")), 
     Expression.Call(
      typeof(Console).GetMethod("WriteLine", new [] { typeof(string) }), 
      Expression.Constant("Greater or equal")) 
     ); 
    return Expression.Lambda<Action<IEnumerable<int>>>(body, new[] { param1 }); 
} 
+0

沒有什麼不對,但一些我不能跟隨他們。例如,我想爲var result = someCollection.FirstOrDefault(predicate)編寫表達式樹;如果(result.value> 10){做其他事情}; –

+0

看到我編輯的答案 –

相關問題