【问题标题】:C# - GetMethod returns nullC# - GetMethod 返回 null
【发布时间】:2017-04-22 06:19:18
【问题描述】:

我有A 类:

public abstract class A
{

}

然后我有派生自它的B 类:

public sealed class B : A
{
    public void SomeMethod()
    {
        var method = this.GetType().GetMethod("AddText");
    }

    private void AddText(string text)
    {
        ...
    }
}

为什么GetMethod 返回 null?

【问题讨论】:

  • 请注意,如果您只是在 Visual Studio 中将鼠标悬停在 GetMethod(...) 上,它会明确指出 Searches for the **public** method with the specified name. 从该消息中我很明显需要另一个重载。
  • 但是为什么不直接打电话给AddText呢?
  • @Grundy,可能是因为这只是一个说明真正问题的玩具问题。所以这里是否有更直接的做事方式无关紧要
  • @Graviton,可能,但你不能确定 :)

标签: c#


【解决方案1】:
var methodInfo = this.GetType().GetMethod("AddText", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string) }, null);

您的方法有一个参数,您需要使用接受类型数组的重载作为参数类型和绑定标志。

在 .net 中,方法签名基于它们的名称、返回类型和参数。

所以如果你的方法有参数,你必须通过 Type[] 告诉 Reflection 它有哪些参数类型。

【讨论】:

  • 其实只要不存在多个重载,指定名称即可。
  • @SLaks 谢谢!缺少“BindingFlags.Instance”修饰符,这就是搜索失败的原因!
  • 如果您的方法是静态的,那么您需要删除 BindingFlags.Instance 方法。不过我很好奇您为什么需要反思,新的 Func 或 Action 功能很有可能会解决您的问题。
  • @Slaks,没错,但这样做是个好习惯,因为如果有人在路上添加了过载,那么代码可能会中断。
【解决方案2】:

默认情况下,Reflection 只会搜索公共方法。

你需要传递BindingFlags.Instance | BindingFlags.NonPublic

【讨论】:

  • 我尝试使用 BindingFlags,它仍然返回 null。
  • 您的方法有一个参数,您需要使用接受类型数组的重载作为参数类型和绑定标志。 GetMehtod 默认返回一个没有参数的公共方法。由于方法重载,您需要告诉反射要获取哪个方法参数签名。
  • @Jashaszun 我也试了一下,还是不行。
  • @Ryios 我尝试删除 AddText 使用的参数,让它没有参数。它仍然返回 null。
  • 您是在 Mono 或 .Net Core 5 上偶然这样做的吗?
猜你喜欢
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多