2009-09-24 88 views
1

我想在我的Repository 中使用lambda表達式作爲通用參數。如果我使用像這樣的一個公司:使用Lambda表達式作爲參數?

MyEntity entity:null 

void Run(Expression<Func<MyEntity ,bool>> expression) 

我可以調用它以這樣的方式

Run(x => x.FirstName = "Whatever") 

我想是這樣做的能力:

Run(x => x.FirstName = "Whatever" and x.LastName = "whatelse") 

Run(x => x.FirstName = "Whatever" && x.LastName = "whatelse") 

並閱讀內容o f x.FirstName和x.LastName在 裏面的程序運行。有沒有辦法做到這一點?

+0

這可能有助於用您正在編寫的語言標記此問題。 –

+0

我認爲這是C#? – Matt

+0

你使用賦值運算符而不是平等測試嗎?否則,最後的版本看起來很好。 – brianary

回答

4

你有你的Run方法聲明爲:

void Run(Expression<Func<MyEntity ,bool>> expression) 

這只是工作,如果你只是它聲明爲:

void Run(Func<MyEntity ,bool> expression) 

有沒有你正在做一個表達的一個原因,而不是隻是一個代表(Func<MyEntity,bool>)直接?

+1

裏德,我想象的是海報使用表達式來檢查Run方法中的表達式(即,不只是執行它)。 –

+0

有區別嗎? – user172105

-1

你有沒有試過如下:

Run(x => (x.FirstName == "Whatever" && x.LastName == "whatelse")) 
+0

是的,它的工作原理,但我想知道程序運行中x.FirstName的價值,我該怎麼做? – user172105

0

我認爲你需要使用

void Run(Action<MyEntity> action) 

然後

Run(x => {x.FirstName = "Whatever"; x.LastName = "whatelse"}) 

,因爲我沒有看到你使用的返回值。

不知道是否表達式<動作<MyEntity> >將工作(如果你需要檢查它),但你可以嘗試。

+0

是的,但我怎麼讀然後行動指定的值? – user172105

+0

爲什麼你不使用這個:{MyEntity tmp;動作(TMP); if(tmp.FirstName)...} - 如果你不想影響你的「工作」實體。 – queen3

+0

下面是如何解析Expression [Action]的示例代碼的鏈接:http://stackoverflow.com/questions/717091/reflection-get-the-list-of-method-calls-inside-a-lambda-expression/717332#717332 – queen3

0

所有的,OP爲什麼要通過參數Expression<Func<MyEntity, bool>>而不是參數Func<MyEntity, bool>是因爲他/她想要在Run方法中檢查表達式本身。

Expression對象有幾個屬性,使您能夠在運行時檢查表達式的特殊性。其中之一Body可用於辨別表達式中使用的代碼,而Parameters集合可用於檢查編譯時可傳遞給表達式的參數的類型和順序。

Console.WriteLine(expression.Parameters[0].Type); //writes MyEntity 
Console.WriteLine(expression.Body); 
    //writes ((x.FirstName == "Bob" && x.LastName == "Smith")) 

在你的例子中,你正在定義一個表達式,但你並沒有真正調用它。因此,實際上並沒有傳入參數(MyEntity對象),因此沒有任何參數需要檢查。