0

我知道以前在这里要求对 ExpandoObjects 进行反射。

我的问题有点不同。我有静态和动态函数,应该从类似于object ExecuteFunction(string name, params object[] parameters).

我通过反射执行静态函数。所以问题是,我是否可以重用 MethodInfo 调用并从 ExpandoObject 中获取 MethodInfo 对象?还是我必须实现 2 个功能(一个 withAction和一个 with MethodInfo)?

4

2 回答 2

3

MethodInfo对于 ExpandoObject 上的动态定义方法,您不会得到任何信息。
动态定义的方法与动态定义的属性相同,只是碰巧属于委托类型。

但是,此委托类型包含一个名为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 回答