【问题标题】:Reflection GetMethod. select a more specific method反射GetMethod。选择更具体的方法
【发布时间】:2010-12-06 09:59:55
【问题描述】:

我想获得该方法,但有不止一个重载。例如,在对象中,我试图获得“等于”。使用时

    public virtual bool Equals(object obj);
    public static bool Equals(object objA, object objB);

typeof(Object).GetMethod("Equals") 让我例外,写typeof(Object).GetMethod("public virtual bool Equals(object obj)") 让我为空。在这种情况下如何指定我想要的方法?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    使用one of the overloads 可以指定参数类型。

    例如:

    var staticMethod = typeof(Object).GetMethod("Equals",
          BindingFlags.Static | BindingFlags.Public,
          null,
          new Type[] { typeof(object), typeof(object) },
          null);
    
    var instanceMethod = typeof(Object).GetMethod("Equals",
          BindingFlags.Instance | BindingFlags.Public,
          null,
          new Type[] { typeof(object) },
          null);
    

    或者:

    var staticMethod = typeof(Object).GetMethod("Equals",
          new Type[] { typeof(object), typeof(object) });
    
    var instanceMethod = typeof(Object).GetMethod("Equals",
          new Type[] { typeof(object) });
    

    【讨论】:

    • 啊哈!我尝试了重载,只使用了 BindingFlags.Instance。难怪我为什么会得到 null (我自己也尝试了 BindingFlags.Public 而不加思考)。我想检查一个对象是否覆盖了一个方法,所以我试图比较这些方法并且我得到了错误。有没有办法让我查看“Equals”是否与其基础相同或已被覆盖? -edit- 我正在尝试通过反射编写一个糟糕但合适的比较
    • @acidzombie24:说实话,我不确定。我想你可能会得到这个类中声明的方法,然后是基类中声明的方法,看看它们是否相同......但我不确定。
    • 我似乎无法比较它们但是我可以写 .GetBaseDefinition() 所以我所做的就是用基础中的方法调用它,这应该告诉我一个是否被覆盖
    • @acidzombie24:这听起来是个很好的检查方法,是的 :)
    • 啊,没用。真奇怪。我还查看了没有运气的属性。但是我发现使用 .DeclaringType.Name 会报告 dummy 定义为对象的类名,而 myclass 返回自身。看来我已经准备好了
    【解决方案2】:
    MethodInfo methodInfo = typeof(object).GetMethod("Equals", new Type[] { typeof(object), typeof(object) });
    

    【讨论】:

      【解决方案3】:

      你可以试试这个代码..


      公共覆盖无效 OnResultExecuted(ResultExecutedContext filterContext) { var actionName = filterContext.RouteData.Values["action"].ToString();

      var ctlr = filterContext.Controller as Controller;
      if (ctlr == null) return;
      var invoker = ctlr.ActionInvoker as ControllerActionInvoker;
      if (invoker == null) return;
      
      var invokerType = invoker.GetType();
      var getCtlrDescMethod = invokerType.GetMethod("GetControllerDescriptor", BindingFlags.NonPublic | BindingFlags.Instance);
      var ctlrDesc = getCtlrDescMethod.Invoke(invoker, new object[] {ctlr.ControllerContext}) as ControllerDescriptor;
      
      var findActionMethod = invokerType.GetMethod("FindAction", BindingFlags.NonPublic | BindingFlags.Instance);
      var actionDesc = findActionMethod.Invoke(invoker, new object[] { ctlr.ControllerContext, ctlrDesc, actionName }) as ReflectedActionDescriptor;
      if (actionDesc == null) return;
      
      if (actionDesc.MethodInfo.ReturnType == typeof (ActionResult))
      {
          // you're in
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 2020-12-31
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多