首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自ExpandoObject的MethodInfo

来自ExpandoObject的MethodInfo
EN

Stack Overflow用户
提问于 2012-08-21 20:14:12
回答 2查看 408关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-21 20:28:09

对于ExpandoObject上动态定义的方法,您将不会获得任何MethodInfo

动态定义的方法和动态定义的属性是一样的,它们只是碰巧是委托类型。

但是,此委托类型包含名为MethodInfo类型的名为Method的属性,您可以使用该属性:

代码语言:javascript
复制
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的其他特性,所以这个参数就是我们需要其功能的已实现接口的类型。

票数 3
EN

Stack Overflow用户

发布于 2012-08-21 22:23:22

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12054614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档