2012-06-02 55 views
0

我正在嘗試使用表達式(Microsoft.Scripting.Ast),並需要爲具有委託的委託變量分配另一個實例方法,然後調用該委託。不幸的是,我很無能:(使用Ast.Expressions創建委託

var @delegate = Expression.Variable (typeof (Delegate)); 
var expression = Expression.Block(
    new [] { @delegate }, 
    Expression.Assign(@delegate, /* MISSED PART */), 
    Expression.Call(@delegate, typeof(Delegate).GetMethod("DynamicInvoke")) 
); 

請告訴我,如果我錯過了什麼。這是我最近開始實習的機會。所以這是可能的,它沒有任何意義可言^^

+0

那麼你'不使用Block方法的結果,一開始... –

+0

對不起,我的錯誤。 _Btw,謝謝你的書。它就在我旁邊;) – Matthias

+0

你真的*使用Microsoft.Scripting.Ast而不是「正常」表達式樹(System.Linq.Expressions),順便說一句?如果是這樣,你有什麼特別的理由這樣做? (很高興你喜歡這本書,順便說一句)。我沒有任何Microsoft.Scripting.Ast的經驗,但如果你能提供一個你想要做的更完整的例子,我會去系統.Linq.Expressions ... –

回答

0

答案是Expression.GetDelegateType(...)

下面的代碼片段,對於MethodInfo創建一個委託:

public static Type GetDelegateType (this MethodInfo methodInfo) 
{ 
    var parameterTypes = methodInfo.GetParameters().Select (x => x.ParameterType); 
    var returnType = new[] { methodInfo.ReturnType }; 

    var delegateTypes = parameterTypes.Concat (returnType).ToArray(); 
    return Expression.GetDelegateType (delegateTypes); 
}