首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态行为包装器

动态行为包装器
EN

Code Review用户
提问于 2011-04-30 17:18:28
回答 1查看 237关注 0票数 4

我正在为C#中的动态行为编写一个包装器。如果我使用GetMethod(),那么当有多个方法(重载)时会抛出一个异常。我认为,在运行时,如果存在参数不匹配的情况,就会变得很明显。这是解决问题的好办法吗?

代码语言:javascript
复制
public class StaticMembersDynamicWrapper : DynamicObject
{
  private Type _type;

  public StaticMembersDynamicWrapper(Type type) { _type = type; }

  // Handle static methods
  public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  {
     var methods = _type
        .GetMethods(BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public)
        .Where(methodInfo => methodInfo.Name == binder.Name);

     var method = methods.FirstOrDefault();
     if (method != null)
     {
        result = method.Invoke(null, args);
        return true;
     }

     result = null;
     return false;
  }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2011-05-01 00:37:15

方法信息返回的顺序似乎不是一个定义的顺序,我建议对参数类型进行过滤,以避免当顺序发生变化时,所有这些信息都崩溃的风险。

此外,您可能希望考虑在基类和子类上定义方法时的情况。

代码语言:javascript
复制
class A
{
    public static void DoAwsomeStuff()
    {
        // really awsome stuff.
    }
}

class B : A
{
    public static void DoAwsomeStuff()
    {
        // different but still awsome stuff.
    }
}

隐藏这样的静态方法可能会受到反对,但同样,我建议使用最具体的声明类型来选择该方法。只是为了安全。

代码语言:javascript
复制
MethodInfo method = null;

foreach(var current in methods)
{
    if(method == null || current.DeclaringType.IsAssignableFrom(method.DeclaringType))
    {
        method = current;
    }
}

编辑:

另一个值得探讨的可能性是Type.InvokeMember()的使用。这已经考虑到了为您隐藏的参数类型和方法。

代码语言:javascript
复制
try
{
    result = _type.InvokeMember(
        binder.Name,
        BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.InvokeMethod,
        null,
        null,
        args
        );

    return true;
}
catch(MissingMethodException)
{
    result = null;
    return false;
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2184

复制
相关文章

相似问题

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