c# - 为什么 GetMethod 需要 BindingFlags 作为强制信息才能找到方法?

标签 c# reflection

假设我有一个带有私有(private)方法的类:

public class Test
{
    private void Method()
    {
    }
}

还有这段代码:

var method1 = typeof(Test).GetMethod("Method"); // null
var method2 = typeof(Test).GetMethod("Method", BindingFlags.NonPublic | BindingFlags.Instance); // works!!
var method3 = typeof(Test).GetMethod("Method",BindingFlags.Instance); // null
  1. 为什么 method1method3 为空?

  2. 为什么我必须指定 BindingFlags 才能实际获取方法?
    如果是因为我可以有多个同名方法,那怎么办GetMethods 的存在是为了什么?

  3. 我需要具体到什么程度?在这种情况下,我需要补充一点,我正在寻找一个非公共(public) & 实例方法。由于并非所有的 BindingFlags 值都是直截了当的,我怎么知道我需要在哪里停止?

最佳答案

Private 修饰符表示“对外部隐藏此方法”,因此默认情况下 GetMethods() 仅返回公共(public)成员。

1.method1和method3为null,因为在this MSDN link中特别提到了“您必须指定 Instance 或 Static 以及 Public 或 NonPublic,否则将不会返回任何成员。”

2.要使用反射,您必须确切地知道您在寻找什么,否则您可能会调用错误的方法。

3.正如我在第一个答案中提到的,您必须至少指定“实例或静态以及公共(public)或非公共(public)”。

关于c# - 为什么 GetMethod 需要 BindingFlags 作为强制信息才能找到方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31223394/

相关文章:

php反射获取属性而不获取基类的属性

java - 为什么这种使用反射的方法会抛出 npe?

java - 方法调用“telephonyService.answerRingingCall();”的错误“telephonyService无法解析”

c# - 我如何在文件后面的C#代码中向面板(div)添加标题属性?

c# - 使用 Dictionary<string, object> 作为 Dictionary<string, Dictionary<string, string>>

javascript - 带有多个 Web 表单的 jQuery 选项卡

c# - 如何删除罗斯林?

c# - 从程序集中检索PDB

scala - 为什么Scala原语不会在Java反射中显示为类型参数?

java - 哪个 java.lang.Class 方法为 Class.forName() 生成正确的输入?