2011-03-06 2 views
-1

리플렉션을 사용하여 오브젝트 속성이 변경되면 알림을 받고 싶습니다.리플렉션에서 PropertyChanged 사용

이 mjpeg.dll의 클래스 중 하나입니다

public class MJPEGConfiguration : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private string psw; 
     public string password 
     { 
      get 
      { 
       return psw; 
      } 
      set 
      { 
       psw = value; 
       OnPropertyChanged("PSW"); 
      } 
     } 

     public virtual void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

내 camera.cs에서, 나는 "개체 구성"에 MJPEGConfiguration 객체를 설정하고이 객체로하여 PropertyChanged 이벤트를 추가 :

public object Configuration 
    { 
     get 
     { 
      return configuration; 
     } 
     set 
     { 
      configuration = value; 

      Type t = configuration.GetType(); //t is the type of "MJPEGConfiguration" 
      EventInfo ei = t.GetEvent("PropertyChanged"); 
      MethodInfo mi = this.GetType().GetMethod("My_PropertyChanged"); 
      Delegate dg = Delegate.CreateDelegate(ei.EventHandlerType, mi); 
      ei.AddEventHandler(configuration, dg); 
     } 
    } 

    public void My_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 

    } 

그러나 "Delegate dg = ...."줄에서 ArgumentException (대상 메서드에 대한 바인딩 오류)가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? 아니면 이것을 할 수있는 올바른 방법이 있습니까?

+0

답변이 도움이 되었으면 허용 된 것으로 표시하십시오. 그렇지 않은 경우 이유에 대한 의견을 추가하십시오. –

답변

0

호출중인 .CreateDelegate의 오버로드가 정적 메서드에 바인딩하려고합니다. 인스턴스 메소드의 경우 다음을 수행하십시오.

Delegate dg = Delegate.CreateDelegate(et, value, mi); 
+1

PS - Object를 Configuration 유형으로 다시 생각해 볼 수 있습니다. 나는 구체적인 유형이나 인터페이스를 사용하는 것에 대해 논쟁 할 것이다. 그 중 하나를 사용하면 반사 코드를 제거 할 수 있습니다. –

관련 문제