2014-02-27 38 views
3

我試圖創建一個編譯表達式委託調用構造採取單一的參數,我收到以下異常:調用參數化的構造函數使用編譯表達

Additional information: variable 'value' of type 'MyType' referenced from scope '', but it is not defined 

的代碼如下:

var constructorInfo = instanceType.GetConstructors().Skip(1).First(); 

ParameterExpression param = Expression.Parameter(genericArgument, "value"); 
Delegate constructorDelegate = Expression.Lambda(Expression.New(constructorInfo, new Expression[] { param })).Compile(); 

我相信我正在接受異常,因爲參數'value'沒有在Expression.Block中作用域。

如何限制Expression.Block中的參數&構造函數表達式?

+0

您可以使用ctor發佈類型定義嗎? – Dennis

回答

5

爲了聲明參數value,您還需要在創建Lambda表達式時指定它(請參閱Expression.Lambda方法的此overload)。到目前爲止,您只能創建一個參數化的lambda表達式,但不要聲明表達式中使用的參數。更改您的代碼應該可以解決問題:

var lambdaExpr = Expression.Lambda(Expression.New(constructorInfo, 
                new Expression[] { param }), 
            param); 
Delegate constructorDelegate = lambdaExpr.Compile(); 
+0

這沒有太大的工作,我已經在 – AwkwardCoder

+1

@ AwkwardCoder下面發佈了答案:很高興聽到它現在有效。但是,我看不出我的答案有什麼不同。相關的更改似乎是將'param'作爲額外參數添加到'Expression.Lambda'的調用中。無論如何,如果它有效,它就會起作用。 – Markus

+0

DOH! - 它再次檢查後確實有效 – AwkwardCoder

相關問題