【问题标题】:Why does it not execute the method with reflection为什么它不执行反射的方法
【发布时间】:2013-06-04 08:45:45
【问题描述】:

我正在尝试通过反射在一个类中执行一个方法。尽管该方法存在,但我仍然收到 MethodNotFound 异常

public virtual void ExecuteMethod(string MethodName) 
    {
        if(this is ISelectable)
        {
            Type thisType = (this as ISelectable).GetType();
            thisType.InvokeMember(MethodName, BindingFlags.InvokeMethod | BindingFlags.Public , null, null, null);
        }
    }

    public virtual void Add( ) { }

也许值得一提的是,这些方法位于基类中,而 ExecuteMethod 正在子类上被调用。我认为这不重要,但无论如何。

【问题讨论】:

  • 这个方法是你试图调用的静态方法吗?
  • 那你需要一个实例来传递invoke方法

标签: c# exception reflection methods


【解决方案1】:

您已指定要执行的方法,但未指定要在哪个对象 上执行它。您不能只对 type 执行某些操作,您需要指定一个具体对象。您使用类型来获取方法的元数据,然后使用该信息在实际对象上调用方法。 Check this MSDN page 了解更多详情。

倒数第二个null 应该是对象,在你的情况下可能是this

【讨论】:

  • 这是最后一件事
  • @user853710 - 只是出于好奇,您为什么取消标记我的答案?我确实提到您在参数列表中缺少this,它在我的回答中突出显示。不过,你接受谁的答案,就看你自己了……
  • 对不起,伙计。一定是双击或意外
  • @user853710 没问题,就像我说的那样,总是由提问者来选择标记哪个(如果有的话)答案......我只是好奇。一切都好:)
【解决方案2】:

来自documentation

您必须指定 InstanceStatic 以及 PublicNonPublic 或 不会返回任何成员。

从代码看来,在你的情况下方法是static,所以添加BindingFlags.Static

【讨论】:

  • 更不用说在FlattenHeirarchy中组合也很好。虽然这不是他唯一的问题。
【解决方案3】:

尝试发送具有该方法的对象的实例

thisType.InvokeMember(MethodName, BindingFlags.InvokeMethod | BindingFlags.Public, null
    , this // instance of the object which has the method
    , null);

【讨论】:

    【解决方案4】:

    这是另一种方式

    MethodInfo _methodinfo= type.GetMethod(MethodName);
    _methodinfo.Invoke(null, null)
    

    【讨论】:

    • 您假设该方法是在静态类上调用的 - 您应该提及这一点,否则您的代码将会失败。
    • 没有朋友,这段代码已经过测试,您创建了一个测试类 C,并且在类型中您提到了包含该方法的 Type type = typeof(C)。在给出负面评论之前,您应该检查您的事实
    • 让我将您指向the doco,然后还将您指向异常部分中的 TargetException。当使用 static 类时,第一个参数只能为 null。
    • 好吧好吧好吧我明白你想说的了。我在制作测试程序时使用了一些静态构造函数,感谢您的纠正和抱歉:)
    • 不用担心,你只需要指出这种事情,否则提出问题的人会尝试它,如果它对他们不起作用,然后再回来提出更多问题。一切都好:)
    猜你喜欢
    • 2012-06-13
    • 2010-09-07
    • 2010-10-26
    • 2010-12-21
    • 2011-05-07
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多