2009-10-12 65 views
1

我正試圖創建一個表達式樹,其中包含對某個模塊上的F#函數的函數調用。但是,我失去了一些東西,因爲幫助函數無法找到我提供的函數System.Linq.Expressions.Expression.Call()通過Linq表達式樹MethodCallExpression節點調用F#函數?

呼叫()調用給出了一個InvalidOperationException異常:「沒有方法上鍵入'myFunction的‘TestReflection.Functions’是與提供的參數兼容。」

如果任何人都可以給我一個提示我做錯了這將是非常有幫助的。

見下面的代碼:

namespace TestReflection 

open System.Linq.Expressions 

module Functions = 
    let myFunction (x: float) = 
     x*x 

    let assem = System.Reflection.Assembly.GetExecutingAssembly() 
    let modul = assem.GetType("TestReflection.Functions") 
    let mi = modul.GetMethod("myFunction") 
    let pi = mi.GetParameters() 

    let argTypes = 
     Array.map 
      (fun (x: System.Reflection.ParameterInfo) -> x.ParameterType) pi 

    let parArray = 
     [| (Expression.Parameter(typeof<float>, "a") :> Expression); |] 
    let ce = Expression.Call(modul, mi.Name, argTypes, parArray) 

    let del = (Expression.Lambda<System.Func<float, float>>(ce)).Compile() 

printf "%A" (Functions.del.Invoke(3.5)) 

問候, 裏卡德

回答

3

的第三個參數是Expression.Call的一般類型參數的陣列 - 你的方法沒有通用的,所以,應該是null。你還需要通過你的「一個」參數Expression.Lambda

let a = Expression.Parameter(typeof<float>, "a") 
    let parArray = [| (a :> Expression); |] 
    let ce = Expression.Call(modul, mi.Name, null, parArray) 

    let del = (Expression.Lambda<System.Func<float, float>>(ce, a)).Compile() 
+0

這就像一個魅力 - 謝謝你! – Rickard 2009-10-12 19:58:35