按名称调用非静态方法

9
我一直在尝试按名称调用方法,但问题是我调用的方法不能是静态的,它需要属于当前类。
我已经尝试了以下方式:
public static void InvokeMenuMethod(string methodName, object sender, EventArgs e)
  Type calledType = Type.GetType("MyNamespace.MyClass");
  calledType.InvokeMember(
    methodName,
    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
    null,
    null,
    new object[] { sender, e }
  );
}

这显然只适用于静态成员,所以我尝试了类似下面的方法。
public static void InvokeMenuMethod(string methodName, object sender, EventArgs e)
  Type calledType = Type.GetType("this");
  calledType.InvokeMember(
    methodName,
    BindingFlags.InvokeMethod | BindingFlags.Public,
    null,
    null,
    new object[] { sender, e }
  );
}

但是我遇到了错误:必须指定描述所需调用操作的绑定标志(BindingFlags.InvokeMethod CreateInstance GetField SetField GetProperty SetProperty)。 参数名:bindingFlags

那么我该如何解决呢?

编辑:

所以:

public void InvokeMenuMethod(string methodName, object sender, EventArgs e) {
    Type.GetType("this").InvokeMember(
        methodName,
        BindingFlags.InvokeMethod,
        null,
        this,
        new object[] { sender, e }
    );
}

出现了NullReferenceException

解决方案: Type.GetType("this")中没有"this"


你试过BindingFlags.Instance了吗? - Steven
请查看我的修改后的代码 - GetType("this") 抛出异常是因为它是错误的... - Yahia
2个回答

12
尝试
 this.GetType().InvokeMember(
    methodName,
    BindingFlags.InvokeMethod,
    null,
    this,
    new object[] { sender, e }
  );

本文内容摘自MSDN

如果仅指定InvokeMethod,则会自动包含BindingFlags.Public、BindingFlags.Instance和BindingFlags.Static。


这是 BindingFlags.Default。一旦您指定了任何 BindingFlags,您就会失去默认值。 - SLaks
@SLaks 上面的内容是从MSDN复制并粘贴的 - 它说仅指定 InveokeMethod 就包括了其他标志,请查看链接... - Yahia

0

你可以添加 BingingFlags.Instance


你是指 BindingFlags.Instance 吗? - Mark Lalor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接