2011-10-11 39 views
4

我有一個簡單的lambda表達式,我想編譯並調用LambdaExpression變量引用從範圍,但未定義

Expression< Func< Commands, bool>> expression = c => c.IsValid("test"); 

但是當我做到以下幾點:

LambdaExpression le = Expression.Lambda(expression.Body); 

object result = le.Compile().DynamicInvoke(); 

編譯投錯誤:

variable 'c' of type 'ConsoleApplication1.Commands' referenced from scope '', but it is not defined

你如何設置這個表達式的實例變量?

回答

4

爲什麼不直接編譯表達式本身?如果你想用一些特定的「ConsoleApplication1.Commands」實例來調用它多次,然後你可以正好接近了該實例:

 

var validator = expression.Compile(); 

var c = new Commands(); 
var validatorForC =() => validator(c); 
 

否則,你就需要建立呼叫的表情,就像這樣:

 

var c = new Commands(); 
var le = Expression.Lambda(Expression.Invoke(expression, Expression.Constant(c))); 
object result = le.Compile().DynamicInvoke(); 
 

,或者你可以讓ExpressionVisitor將取代「C」參數的所有出現在「expression.Body」與Expression.Constant。

+0

我不想直接編譯表達式,因爲我解析它來將它轉換成另一種語言/語法。對我來說,解決方案是創建一個BlockExpression,並在該表達式中將參數分配給我想要的對象的實例。 (只花了我一天的時間來解決這個問題......) – KanTube

相關問題