2009-09-15 7 views
12

Set가 호출 될 때 INotifyPropertyChanged과 같이 변경 이벤트를 발생시키면서 자동 구현 속성을 계속 사용하는 방법이 있습니까? 대신C에서 자동 구현 된 속성

:

private string _value; 
public string Value 
{ 
    get 
    { 
    return this._value; 
    } 
    set 
    { 
    this._value = value; 
    this.ValueChanged(this,EventArgs.Empty); 
    } 
} 

난 그냥 수행 할 수 있습니다 세터 잘못 보이는

public string Value 
{ 
    get; 
    set 
    { 
    this.ValueChanged(this,EventArgs.Empty); 
    } 
} 

있지만 백업 저장 변수를 내 클래스를 작성하지 않고이 작업을 수행 할 수 있습니까?

업데이트 : 저의 게으른 목표에 대한 표준 해결책이없는 것처럼 보입니다. 최선의 해결책은 CodeRush 또는 Resharper를 사용하여 저의 모든 후원 점포를 생성하는 것입니다.

답변

6

. 자동으로 구현 된 속성에 대한 사양은 매우 분명하다

자동으로 구현 (자동 실행) 속성 이 패턴을 자동화 할 수 있습니다. 보다 구체적으로는 추상화가 아닌 속성 선언은 세미콜론 접근자인 본문을 가질 수 있습니다. 두 접근자는 모두 이어야하며 둘 다 세미콜론 본문이 있어야합니다. 접근성 수정자를 가질 수 있습니다. 속성이 이와 같이 지정되면보조 입력란은 자동으로 속성에 대해 이 생성되고 접근자는 을 읽고 그 뒷받침 필드에서 작성하도록 구현됩니다. 백킹 필드의 이름은 이며 사용자는 에 액세스 할 수 없습니다. 즉

, 그들은 단지 액세스 수정의 가능성과 함께, "set;"을 "get;"을 가지고 있습니다.

4

당신이

4

"에서 INotifyPropertyChanged 자동 등록"에 대한 빠른 Google 검색은 여러 블로그 게시물과 기사로 당신을 이끌 것입니다 해당 속성에 대해 생성 private 필드에 액세스 할 수 없기 때문에 아니 당신은 할 수 없습니다 제목. 여기에 하나입니다 : 당신은이 작업을 수행 할 수 없습니다

INotifyPropertyChanged auto wiring or how to get rid of redundant code

+0

나는이 일 것을 볼 수 있지만, 실제로 백업 저장 변수를 사용하는 것보다 지저분 보이는 – benPearce

+0

benPearce : 자동 속성을 사용하지 않으려는 경우입니다 setter 또는 getter에 다른 코드를 작성하십시오. 당신이 (재산 변경 통보와 같은) 할 경우 당신은 그것을 작성해야합니다. PostSharp 접근법에 동의하지 않지만 분명히 일종의 솔루션입니다. 나는 변수를 수동으로 작성하는 코드에 상당히 익숙하다. –

+0

실키 : 저는 Postsharp에 대해 당신의 의견에 동의합니다. 특히 해결책이 아니라고 생각합니다. – benPearce

1

이것은 C# 3.0 뒤에있는 Microsoft 팀의 질문이며 그들은 그것에 대해 생각할 것이라고 말했습니다. 읽는 사람은 here입니다.

의견을 통해 더 많은 통제가 필요한 경우 왜 그런가를 비롯하여 더 많은 정보를 얻을 수 있습니다.

1

PostSharp과 같은 일부 AOP 프레임 워크를 사용할 수 있습니다.

그러나 성능 및 빌드 시간을 줄일 수 있습니다.

+0

Postsharp 2.0이 정확히 이것을하는 것처럼 보입니다 - http://www.postsharp.org/blog/introducing-postsharp-20-1-notifypropertychanged – benPearce

0

이 동작은 프록시 팩토리 유형 생성기를 사용하여 수행 할 수 있습니다. 이미 개발 프레임 워크에서이 작업을 수행했습니다. System.Reflection.Emit을 사용하는 경우 유형 프록시를 만들 수 있습니다. 예를 아래에 고려 : 추가 기능 PropertyChanged이 작업을 수행 https://github.com/demigor/kindofmagic

1

나는이 문제가 실제로 속성으로 해결하고 작업을 구축하고있다이 질문을하기 때문에. KindOfMagic처럼 Fody는 Mono.Cecil을 사용하여 컴파일 타임에 .net 어셈블리의 IL을 수정합니다. 다음의 예는하여 PropertyChanged 문서에 나와 :

당신은 쓰기 :

[ImplementPropertyChanged] 
public class Person 
{   
    public string GivenNames { get; set; } 
    public string FamilyName { get; set; } 

    public string FullName 
    { 
     get 
     { 
      return string.Format("{0} {1}", GivenNames, FamilyName); 
     } 
    } 
} 

컴파일됩니다 무엇 :

public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    string givenNames; 
    public string GivenNames 
    { 
     get { return givenNames; } 
     set 
     { 
      if (value != givenNames) 
      { 
       givenNames = value; 
       OnPropertyChanged("GivenNames"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    string familyName; 
    public string FamilyName 
    { 
     get { return familyName; } 
     set 
     { 
      if (value != familyName) 
      { 
       familyName = value; 
       OnPropertyChanged("FamilyName"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    public string FullName 
    { 
     get 
     { 
      return string.Format("{0} {1}", GivenNames, FamilyName); 
     } 
    } 

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

wiki 좀 더 진보 된 예제를 포함합니다.

이 NuGet 사용하여 볼 수 있습니다 :

PM> Install-Package PropertyChanged.Fody 
0

Fody :

var a = Proxier<InputType>.CreateInstance(new object[] { }); // object arrays are for different constructors 
a.PropertyAccessed += ...