0

以前ここで ExpandoObjects の Reflection を求められたことは知っています。

私の質問は少し異なります。に似た関数から実行する必要がある静的関数と動的関数がありますobject ExecuteFunction(string name, params object[] parameters)

リフレクションを介して静的関数を実行します。問題は、MethodInfo 呼び出しを再利用して、ExpandoObject から MethodInfo オブジェクトを取得できるかどうかです。Actionまたは、2 つの関数 (1つと 1 つ)を実装する必要がありMethodInfoますか?

4

2 に答える 2

3

MethodInfoExpandoObject で動的に定義されたメソッドについては何も取得しません。
動的に定義されたメソッドは、動的に定義されたプロパティと同じですが、デリゲート型になっているだけです。

ただし、このデリゲート型には、利用できるMethodtype という名前のプロパティが含まれています。MethodInfo

object ExecuteFunction(IDictionary<string, object> obj, string name,
                       params object[] parameters)
{
    object property;
    if(!obj.TryGetValue(name, out property))
        return null;

    var del = property as Delegate;
    if(del == null)
        return null;

    var methodInfo = del.Method;

    // do with methodInfo what you need to do to invoke it.
    // This should be in its own method so you can call it from both versions of your
    // ExecuteFunction method.
}

最初のパラメータの型はIDictionary<string, object>. ExpandoObjectはこのインターフェイスを実装しており、 の他の機能は必要ありませんExpandoObject。そのため、パラメータは、機能が必要な実装されたインターフェイスの型になります。

于 2012-08-21T12:28:08.967 に答える
1

オープンソースフレームワークImpromptuInterface(nugetから入手可能)を使用すると、文字列名でメソッドを呼び出すことができるDLR呼び出しに簡単にアクセスできます。唯一の問題は、メソッドがvoidを返す場合は、InvokeMemberActionを使用する必要があり、値を返す場合は、InvokeMemberを使用できることです。これにより、動的に定義されたメソッドを呼び出すことができ、リフレクションよりも高速に静的に定義されたメソッドを呼び出すことができます。

于 2012-08-21T14:23:21.913 に答える