2017-05-05 58 views
0

我想打電話給這樣的方法:我可以將lambda表達式數組傳遞給帶有params參數的方法嗎?

簽名:void Method(object a, object b, params LambdaExpression[] expressions);

電話:Method(a, b, x => x.A, x => x.B)

這可能嗎?

我們假設'x'的類型是一個常量類型。例如,如果x => xA且y => yB是Funcs,那麼它們將是Func<TType,*>,這樣params數組總是具有相同類型的TType,但返回值的類型*可能因參數的元素不同而不同陣列。這就是爲什麼我不得不選擇像LambdaExpression那樣更通用的類型,但我不知道這是否可行。我可以在運行時在方法中解壓縮表達式,但是我只是在嘗試將表達式傳遞給方法時遇到困難,因爲它們的兩個泛型類型參數之一有所不同。

這將是罰款,即使我不得不把它更像是:Method(a, b, (Type x) => x.A, (Type x) => x.B)

回答

2

可以,但編譯器協助該會變成你的代碼,以表達(VS編譯它),只有仿製藥工作。所以,你必須

Expression<Func<TType, AType>> expr1 = x => x.A; 
Expression<Func<TType, BType>> expr2 = x => x.B; 

Method(a, b, expr1, expr2); 

或鑄造直列

Method(a, b, (Expression<Func<TType, AType>>) (x => x.A), expr2) 

,或者使用更通用的類型參數

void Method(object a, object b, params Expression<Func<object, object>>[] expressions) 
+0

所以基本上,答案是否定的。我必須在編譯時指定類型。 – Triynko

+1

是的,但是您只使用可讀性/更多的輸入 - 在編譯時您已經知道表達式的類型。 如果你想避免轉換,你可以使用更通用的參數類型 - 參見更新。 – Bond

+0

最後一個解決方案是這樣的,因爲它允許你像這樣調用諸如'void Method (params Expression >表達式)的方法:'方法(x => x.Wheel,x = > w.Door)'而不需要任何明確的轉換。編譯器能夠從'x => x.Wheel'創建一個表達式,因爲類型是'Expression >'。此外,表達式實際上可以在運行時使用反射和對「Expression.Lambda」的調用轉換爲更強大的類型,例如'Expression >',但這超出了此問題的範圍。謝謝。 – Triynko

相關問題