.Net无法通过反射获取私有方法

.Net无法通过反射获取私有方法,.net,reflection,private-methods,.net,Reflection,Private Methods,我在使用反射获取私有方法时遇到问题。 即使使用BindingFlags.NonPublic和BindingFlags.Instance,它也不起作用。 HandleClientDrivenStatePropertyChanged与CreateRadioPropertyInstances方法在同一个类上定义 class Program { static void Main(string[] args) { RadioPropertiesState st

我在使用反射获取私有方法时遇到问题。 即使使用BindingFlags.NonPublic和BindingFlags.Instance,它也不起作用。 HandleClientDrivenStatePropertyChanged与CreateRadioPropertyInstances方法在同一个类上定义

 class Program
 {
      static void Main(string[] args)
      {
         RadioPropertiesState state = new RadioPropertiesState();
      }
 }

 internal class RadioPropertiesState : BaseRadioPropertiesState
 {
 }

 internal class BaseRadioPropertiesState
 {
     public BaseRadioPropertiesState()
     {
          CreateRadioPropertyInstances();
     }

     private void CreateRadioPropertyInstances()
     {
          // get the method that is subscribed to the changed event
          MethodInfo changedEventHandlerInfo = GetType().GetMethod(
               "HandleClientDrivenStatePropertyChanged",
               BindingFlags.NonPublic | BindingFlags.Instance | 
               BindingFlags.IgnoreCase);
     }

     private void HandleClientDrivenStatePropertyChanged
         (object sender, EventArgs e)
     {
     }
}
GetMethod返回null。 有什么问题吗


[编辑的代码]

要获取私有成员,您需要对声明它的确切类型而不是派生类型调用
GetMethod


BindingFlags.FlattHierarchy
在这里不起作用,因为该方法是私有的。

要获取私有成员,需要对声明它的确切类型而不是派生类型调用
GetMethod


BindingFlags.FlattHierarchy
在这里不起作用,因为该方法是私有的。

问题正是我在评论中建议的-您试图根据对象的执行时间类型找到该方法,即
RadioPropertiesState
。。。但它不是在那个类型中声明的,也不是对它可见的

将您的
GetMethod
调用更改为:

MethodInfo changedEventHandlerInfo = typeof(BaseRadioPropertiesState)
                                         .GetMethod(...)

它工作得很好。

问题正是我在评论中提出的-您试图根据对象的执行时间类型找到方法,即
RadioPropertiesState
。。。但它不是在那个类型中声明的,也不是对它可见的

将您的
GetMethod
调用更改为:

MethodInfo changedEventHandlerInfo = typeof(BaseRadioPropertiesState)
                                         .GetMethod(...)

而且它工作得很好。

奇怪,在.NET 4上工作得很好。尝试使用BindingFlagsAn。另一种猜测是,这可能是由于缺少某些权限造成的。如何调用use
类X
?它是加载到不同的域还是从smt的远程源加载的?请展示一个简短但完整的程序来演示这个问题。这应该没问题——当然,如果这个方法最终在派生类上被调用,它将找不到它…@jonskeet:我发布了更多的代码it@leozilla当前位置在我看来,这不是一个完整的程序。主要的方法在哪里?奇怪,在.NET4上很好用。尝试使用BindingFlagsAn。另一种猜测是,这可能是由于缺少某些权限造成的。如何调用use
类X
?它是加载到不同的域还是从smt的远程源加载的?请展示一个简短但完整的程序来演示这个问题。这应该没问题——当然,如果这个方法最终在派生类上被调用,它将找不到它…@jonskeet:我发布了更多的代码it@leozilla当前位置在我看来,这不是一个完整的程序。主要的方法在哪里?