按名称调用非静态方法

发布于 2024-12-01 21:39:51 字数 1355 浏览 4 评论 0原文

我一直在尝试按名称调用方法,但问题是我调用的方法不能是静态的,它必须是当前类的方法。

我尝试过这样做的方法:

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”

I've been trying to invoke a method by name but the problem is the method I invoke cannot be static and it needs to be of the current class.

I've tried the way of doing it like this:

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 }
  );
}

This obviously only works for static members so I tried something like this

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 }
  );
}

But I get Must specify binding flags describing the invoke operation required (BindingFlags.InvokeMethod CreateInstance GetField SetField GetProperty SetProperty).
Parameter name: bindingFlags
error...

So how can I go about doing this?

EDIT:

So:

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

Gives a NullReferenceException

Solution:
No "this" in Type.GetType("this")

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦初启 2024-12-08 21:39:51

尝试

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

来自 MSDN

如果InvokeMethod自己指定,BindingFlags.Public,
BindingFlags.Instance 和 BindingFlags.Static 自动
包括

try

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

From MSDN

If InvokeMethod is specified by itself, BindingFlags.Public,
BindingFlags.Instance, and BindingFlags.Static are automatically
included

川水往事 2024-12-08 21:39:51

您可以添加 BingingFlags.Instance

You can add BingingFlags.Instance.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文