2009-11-02 3 views
6

이것은 속성에 대해 배우고 INotifyPropertyChanged를 너무 많이 사용하면서 생각한 것일뿐입니다. Idea와 이에 대한 몇 가지 의견을 듣고 싶습니다. (알고 있습니다. 이것은 컴파일러에 대한 것이고 cosumer 측에 대한 작업이 필요하지는 않습니다.)속성 사용 ... INotifyPropertyChanged

INotifyPropertyChanged는 대부분 같은 시간에 사용되기 때문에 속성의 이름을 가진 이벤트를 발생시키는 메소드를 호출하는 것과 마찬가지로, 속성으로 디자인 할 수 있고 자동 속성을 사용할 수 있습니까? 그래서 컴파일러는 PropertyChanged 이벤트에 대한 호출을 추가해야한다는 것을 알고 있습니까? 우리는 클래스 ....

public class DemoCustomer : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string companyNameValue = String.Empty; 
     ... 
} 

대신 선언 속성이 그래서 경우

public string CompanyName 
    { 
     get 
     { 
      return this.companyNameValue; 
     } 

     set 
     { 
         if (value != this.companyNameValue) 
         { 
          this.companyNameValue = value; 
          NotifyPropertyChanged("CompanyName"); 
         } 
     } 
    } 

우리가 할 필요가 있음을이 속성에 의해 컴파일러에 표시 할 수 있다면 우리는이 같은 뭔가를 할 수 새 값이 우리는 여전히 t 코딩 유지할 수 이전

[NotifyPropertyChanged] 
public string CompanyName 
{ 
    get;set; 
} 

다른 경우 속성의 이름으로하여 PropertyChanged에 대한 호출을 생성 그는 속성을 사용하지 않을 때 몇 가지 맞춤 동작에 대해 낡은 방식입니다.

답변

8

할 수 있습니다 do thisJason BockDimecast 볼 수 있습니다,하지만 난 언제든지 곧 핵심 컴파일러에있을 거라고 생각하지 않습니다.

4

이 스타일을 Aspect Oriented Programming (또는 AOP)이라고합니다. Mono의 Cecil을 사용하여 게시 빌드 작업을 추가하여 해당 특성을 사용하여 속성을 살펴보고 속성의 동작을 수정하고 적절한 동작으로 새로 컴파일 된 어셈블리를 추출하여 최종 결과를 얻을 수 있습니다. 당신은 PostSharp로 "Leveraging Cecil to inject code into your Assemblies"

+0

아주 좋은 읽기 .. 고마워 ... 나는 postsharp를 사용하기 시작했다. 그래서 나는 다른 대답을 지적하고있다. 그러나 이것은 유용합니다. – jmayor

7

누구나이 스레드에서 발생하며 C# 5 (VS 2012+, .NET 4.5+)를 사용 중입니다. 이 경우는 CallerMemberNameAttribute으로 "더 쉽게"수행 할 수 있습니다. 이 속성은 문자열 매개 변수에 적용되며 기본값 (예 : when 및 인수가 전달되지 않은 경우)이 사용될 때 컴파일러가 호출하는 메서드/속성의 이름을 전달합니다. INotifyPropertyChanged 구현을 덜 귀찮게 만듭니다. 예를 들어 :

public class MyClass 
{ 
    private string myProperty; 

    public string MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

그래서, 당신은 단지 이벤트를 보낼 각 세터에 OnPropertyChanged()이 필요하고 속성 이름에 대한 하드 코딩 된 문자열 처리 할 필요가 없습니다.