2013-07-31 25 views
21

Có cách nào để làm việc này không?Thực thi LambdaExpression và nhận giá trị trả về làm đối tượng

Expression<Func<int, string>> exTyped = i => "My int = " + i; 
LambdaExpression lambda = exTyped; 

//later on: 

object input = 4; 
object result = ExecuteLambdaSomeHow(lambda, input); 
//result should be "My int = 4" 

Điều này sẽ phù hợp với nhiều loại khác nhau.

+0

Tại sao không chỉ 'var func = new Func (x => {return string.Format (" My int = {0} ", x);});'? – PoweredByOrange

+1

@PoweredByOrange Tôi giả sử câu hỏi được đơn giản hóa. – Kevin

+0

@Kevin Làm cho tinh thần, nếu không một đơn giản 'string.Format()' sẽ làm điều đó :) – PoweredByOrange

Trả lời

29

chắc ... bạn chỉ cần biên dịch lambda của bạn và sau đó gọi nó ...

object input = 4; 
var compiledLambda = lambda.Compile(); 
var result = compiledLambda.DynamicInvoke(input); 

Styxxy sẽ trả về một điểm tuyệt vời ... Bạn sẽ được phục vụ tốt hơn bằng cách cho phép trình biên dịch giúp bạn ra ngoài . Lưu ý với một biểu thức được biên dịch như trong mã dưới đây đầu vào và kết quả là cả hai mạnh mẽ đánh máy.

var input = 4; 
var compiledExpression = exTyped.Compile(); 
var result = compiledExpression(input); 
+0

'biên dịchLambda.Invoke (đầu vào);' có thể là một lựa chọn tốt hơn ở đây nếu loại chính xác được gọi là @Styxxy chỉ ra. 'Invoke' nhanh hơn' DynamicInvoke' do ít phản xạ xảy ra hơn, xem http://stackoverflow.com/questions/12858340/difference-between-invoke-and-dynamicinvoke –

Các vấn đề liên quan