1

特定のモジュールで F# 関数への関数呼び出しを含む式ツリーを作成しようとしています。ただし、System.Linq.Expressions.Expression.Call()ヘルパー関数が提供している関数を見つけることができないため、何かが欠けています。

Call() 呼び出しにより、InvalidOperationExceptionが返されます: 「タイプ 'TestReflection.Functions' のメソッド 'myFunction' は、指定された引数と互換性がありません。

私が間違っていることについて誰かが私にヒントを与えることができれば、それは非常に役に立ちます。

以下のコードを参照してください。

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))

よろしく、リッカード

4

1 に答える 1

3

の 3 番目の引数Expression.Callは、ジェネリック型パラメーターの配列です。メソッドはジェネリックではないため、null. Expression.Lambdaまた、「a」引数を次のように渡す必要があります。

    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()
于 2009-10-12T19:52:27.217 に答える