我想將一個方法內部的邏輯轉換爲一個表達式,以便我可以存儲它,並在需要時可以編譯它執行。寫一個方法體作爲表達式<>
該方法已流等
1)發生在一個集合屬性的參數
2)做了「FirstOrDefault」在參數
3)通過調用一些方法上的存儲庫類
4)一些如果一些字段的條件
5)創建/實例化
等等在所有複雜的方法,它做很多事情。
問:是否有任何文章/資源可以通過示例向我展示這一點。
謝謝
我想將一個方法內部的邏輯轉換爲一個表達式,以便我可以存儲它,並在需要時可以編譯它執行。寫一個方法體作爲表達式<>
該方法已流等
1)發生在一個集合屬性的參數
2)做了「FirstOrDefault」在參數
3)通過調用一些方法上的存儲庫類
4)一些如果一些字段的條件
5)創建/實例化
等等在所有複雜的方法,它做很多事情。
問:是否有任何文章/資源可以通過示例向我展示這一點。
謝謝
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 });
}
沒有什麼不對,但一些我不能跟隨他們。例如,我想爲var result = someCollection.FirstOrDefault(predicate)編寫表達式樹;如果(result.value> 10){做其他事情}; –
看到我編輯的答案 –
爲什麼需要成爲一個'Expression'?你不能把它作爲一種方法嗎? –
@ Sriram,它已經是一種方法,但團隊中有一些指針將其作爲表達式,以便它充當數據結構而不是代碼。 –
@PrerakK你應該真的問爲什麼這很重要。通常最好將代碼作爲代碼而不是數據 - 如果你打算在運行時修改它,或者如果你需要做一些你不能做的事情,那麼你只是真的想要代碼作爲數據 - 而且經常,除非你真的關心性能,否則最好還是考慮一個不同的方法(存儲庫字典?依賴注入?)。這對你來說是什麼? :) – Luaan