.Net не может получить частный метод путем отражения

У меня проблема с получением частного метода с использованием отражения. Даже с 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 возвращает ноль. В чем может быть проблема?

[отредактированный код]


person leozilla    schedule 17.03.2012    source источник
comment
Странно, отлично работает на .NET 4. Попробуйте поиграться с BindingFlags   -  person alex.b    schedule 17.03.2012
comment
Другое предположение состоит в том, что это может быть вызвано отсутствием некоторых разрешений. Как вы вызываете использование class X? Он загружается в другой домен или из удаленного источника, похожего на smt?   -  person alex.b    schedule 17.03.2012
comment
Покажите короткую, но полную программу, демонстрирующую проблему. Все должно быть в порядке - конечно, если этот метод каким-то образом окажется вызванным в производном классе, он его не найдет...   -  person Jon Skeet    schedule 17.03.2012
comment
@Jon Skeet: я опубликовал больше кода, демонстрирующего это   -  person leozilla    schedule 17.03.2012
comment
@leozilla: мне это не кажется полной программой. Где основной метод?   -  person Jon Skeet    schedule 17.03.2012
comment
@Jon Skeet: теперь я опубликовал работающую программу   -  person leozilla    schedule 17.03.2012
comment
@leozilla: Ну, это было неполным (без использования директивы), оно не было должным образом отформатировано (закрывающая фигурная скобка не показана как часть кода) и не продемонстрировало проблему (вы вызвали метод GetMethod , но ничего не показал о результате). действительно полезно иметь образец, который мы можем просто скопировать, вставить, скомпилировать, запустить и немедленно убедиться, что проблема воспроизводима. К счастью, вашего кода было достаточно, чтобы решить проблему в этом случае — см. мой ответ — но имейте это в виду на будущее.   -  person Jon Skeet    schedule 17.03.2012


Ответы (2)


Проблема именно в том, что я предложил в своем комментарии: вы пытаетесь найти метод, основанный на типе времени выполнения объекта, который равен RadioPropertiesState..., но он не объявлен в этом типе или видна ему.

Измените свой GetMethod вызов на:

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

и это работает нормально.

person Jon Skeet    schedule 17.03.2012

Чтобы получить частные члены, вам нужно вызвать GetMethod для точного типа, где он был объявлен, а не для производного типа.

BindingFlags.FlattenHierarchy здесь не работает, так как метод приватный.

person CodesInChaos    schedule 17.03.2012