2012-10-19 4 views
6

우리는 View 모델에서 INotifyPropertyChanged 구현을 많이하고 있으며 불편하고 심미적 인 이유 때문에 코드에서 명시 적으로 속성 변경 이벤트를 발생시키는 데 지쳐 있습니다.속성 접근 자에 확장 메서드 추가

내가 같은 결과 코드 모양 만들기, 우리의 재산의 세터에 확장을 데려 가고 싶다는

:

public string LazyAccessor 
{ 
    get; 
    set.notify(); 
} 

이 할 수있는 방법이 있나요? 없다면 우리가 발명 할 수 있습니까?

답변

3

Aspect 지향 프로그래밍은 문제의 해결책이 될 수 있습니다.

Aspect Oriented Programming in C#을 참조하십시오. 여기 그리고 몇 가지 예 : http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

귀하의 "set.notify()는"일부 반사와 함께 일할 수있는,하지만 난이 좋은 해결책이 될 것이라고 생각하지는 그리고 당신은 여전히 ​​getter와 setter를 구현해야합니다.

3

Extension methods유형에만 추가 할 수 있습니다. 자동 속성의 getter 및 setter는 메서드으로 컴파일러에서 지원하는 변수로 변환되므로 확장 메서드를 추가 할 방법이 없습니다.

2

이 방법이 있습니까?

아니요, 게시하지 않으 셨습니다. 확장 메소드는 유형에서 작동하며 getter 또는 setter는 작동하지 않습니다.

없으면 하나를 발명 할 수 있습니까?

이렇게하면 발생할 가능성이있는 C# 사양을 변경해야합니다.

쉽게 해결할 수있는 방법이 있습니다. 예를 들어 보일러 플레이트를 호출하는 방법으로 기본 클래스를 사용하면됩니다.

+0

또 다른 흥미로운 접근법. 내 대답을보고 그 것이 실행 가능한지 볼 수 있니? 나는 당신의 평판이 당신 앞에 선 것처럼 당신의 의견을 소중히 생각합니다. 어쩌면 너무 무거워요? –

0

그들은 4.0으로 만들지 않았지만 5.0에 포함될 것이라는 소문이 있습니다.

나는 this 접근법을 찾았습니다.

4

체크 아웃 NotifyPropertyWeaver을 확인하십시오. 이렇게하면 빌드 프로세스 중에 코드가 수정되어 등록 정보가 INotifyPropertyChanged 패턴을 구현하게됩니다.

이 당신은 설정 자체에 그것을 할 수없는 Visual Studio Extension

+0

나는 이것이 PostSharp와 같은 물건으로 AOP의 전조 였는지 아니면 PostSharp가 존재하는지 몰랐는가? –

+0

@BigM 어느 쪽이 작동하는지에 대한 자세한 내용은 잘 모르겠습니다. 나는 둘 다 IL 제직을 사용한다는 것을 알고 있으므로 개념이 비슷합니다. NotifyPropertyWeaver를 사용하는 이유는 속성을 사용하여 코드를 복잡하게 만들 필요가 없다는 것입니다. – cadrell0

+0

해당 솔루션을 사용하는 정당한 이유. PostSharp는 *** 아주 *** 일반이며 이것은 ** 하나 ** 통증 포인트를 해결하기 위해 적합합니다, 그것은 더 간결하게 될 것입니다! –

0

로 사용할 수 있습니다. 그것은 행동입니다.

public static class extensions() 
{ 
    public static NotifyAccessorSet(this string value) { some code } 
} 

public class SomeClass() 
{ 
    ..... 
    private string mAccessor; 

    public string LazyAccessor{ 
    get { return mAccessor; } 
    set { mAccessor = value; mAccessor.NotifyAccessorSet(); } 
    } 

} 

그것은 내 머리 위로 떨어져 다소 그리고 당신이 당신의 자신의 반환 형식을 구현하고 적용 할 수 있도록 확장 방법은 모든 유형의 문자열에 적용 할 것을 명심 : 당신은 그러나이 작업을 수행 할 수있을 것 그것에 대한 확장 메소드. 그런 다음 lazyaccessor에서 해당 유형을 반환하십시오.

+0

확실치 않지만, NotifyPropertyEvent를 발생 시키려면 원래의 객체 (보낸 사람)와 속성 이름 (이 샘플에서는 "LazyAccessor")을 알아야한다. 그래서 당신의 코드는 더 많은 대화를하게 될 것입니다. – Ondra

+0

당신은 원래의 객체를 가질 것입니다 ... NotifyAccessorSet 함수의 "value"가 될 것입니다. 어쨌든 ... 그냥 제안. 이 접근법은 추가 함수 호출을 구현할 것이고, 이는 set 메소드에서 통지를 구현하는 방법을 제공 할뿐입니다. – DRobertE

0

사용자 정의 제네릭 구조체의 변환 연산자를 재정 의하여 이벤트를 수동으로 호출하지 않고도 '속성과 유사한'동작을 에뮬레이트 할 수 있습니다. 다음은 내 솔루션입니다 : 내가 변환 오류를 방지하기 위해 일반적인 매개 변수를 사용하여 구조체를 선언

public struct column<TType> 
{ 
    private TType _value; 

    private column(TType value) : this() 
    { 
     _value = value; 
    } 

    private void Set(TType value) 
    { 
     // Implement your custom set-behavior... 
    } 

    private TType Get() 
    { 
     // Implement your custom get-behavior... 
     return _value; 
    } 

    public override string ToString() 
    { 
     return _value.ToString(); 
    } 

    public static implicit operator column<TType>(TType p) 
    { 
     column<TType> column = new column<TType>(p); 
     column.Set(p); 
     return column; 
    } 

    public static implicit operator TType(column<TType> p) 
    { 
     return p.Get(); 
    } 
} 

. 당신은 이것을 다음과 같이 사용할 수 있습니다 :

public class Test 
{ 
    public column<int> kKey; 

    public column<float> dMoney; 

    public column<string> cValue; 


    public Test() 
    { 
     kKey = 42; 
     dMoney = 3.1415926f; 
     cValue = "May the force be with you!"; 
    } 
} 

... 나는 알고 있습니다. 질문은 오래되었지만 나중에 도움이 될 것입니다.