ExpandoObject的MethodInfo

时间:2012-08-21 12:14:12

标签: c# dynamic reflection expandoobject methodinfo

我知道之前在ExpandoObjects here上被要求反思。

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

我通过Reflection执行静态函数。所以问题是,如果我可以重用MethodInfo调用并从ExpandoObject获取MethodInfo对象?或者我是否必须实现2个功能(一个使用Action,另一个使用MethodInfo)?

2 个答案:

答案 0 :(得分:3)

对于ExpandoObject上的动态定义方法,您不会获得任何MethodInfo 动态定义的方法与动态定义的属性相同,它们恰好是委托类型。

但是,此委托类型包含一个名为Method的属性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的其他功能,所以参数只是我们需要的功能所实现的接口的类型。

答案 1 :(得分:1)

开源框架ImpromptuInterface(可从nuget获得)提供对DLR调用的轻松访问,使您可以通过字符串名称调用方法。唯一的问题是,如果方法返回void,则必须使用InvokeMemberAction,如果返回值,则可以使用InvokeMember。这允许您调用动态定义的方法,并且比反射更快地调用静态定义的方法。