2008-10-29 4 views
2

우리는 우리가 후손의 각 속성은 다음과 같이 기록 일부 MVC와 같은 시스템에 사용하는 기본 개체가 목적 및 통지 및 유효성 확인 목적으로 사용됩니다. 우리는 getter를 사용하여 명시 적으로 읽을 내용을 표시 한 코드가있는 경우 (기본 클래스가 해당 속성이 변경 될 때만 호출 할 수 있도록) 오류가 발생하는 경우 경고합니다. 우리는 setter를 사용합니다.PostSharp 측면, 호출하는 일반적인 방법

물론이 두 개 코드가있다
protected T GetProperty<T>(String propertyName, 
    ref T backingField) 
{ 
    return backingField; 
} 

protected Boolean SetProperty<T>(String propertyName, 
    ref T backingField, 
    T newValue) 
{ 
    backingField = newValue; 
    return true; 
} 

하지만 : 등 단순 들어

속성 변경 알림, 더러운 플래그 처리, 검증, 들어, 이러한 방법의 구현은 다음과 같습니다 가정하자 이 코드는 내 질문과 관련이 없거나 적어도 그렇게하기를 바랍니다. 그렇다면 질문을 수정하겠습니다.

어쨌든,이 같은 자동 속성에 자동으로 저에 대한 호출을 구현하는 PostSharp 측면을 쓰고 싶습니다

public String FirstName { get; set; } 

거기서 내가 가서 얼마나 어떤 생각을 갖고 그 사람이 있나요 이것에 대해서?

내가 직접 OnMethodBoundaryAspect 클래스를 만들었지 만, ref 매개 변수를 사용하여 일반 구현을 호출하는 기술은 저를 배제합니다.

다음은 두 클래스입니다. get 및 set 속성에 대해 올바른 메서드를 자동으로 호출하도록 TestObject 클래스를 보완하고 싶습니다.

public class BaseObject 
{ 
    protected T GetProperty<T>(String propertyName, 
     ref T backingField) 
    { 
     return backingField; 
    } 

    protected Boolean SetProperty<T>(String propertyName, 
     ref T backingField, 
     T newValue) 
    { 
     backingField = newValue; 
    } 
} 

public class TestObject : BaseObject 
{ 
    public String FirstName 
    { 
     get; 
     set; 
    } 

    public String LastName 
    { 
     get; 
     set; 
    } 
} 


편집 :뿐만 아니라 PostSharp forum에 게시 됨.

답변

2

매우 간단해야합니다. OnEntry를 재정의하고 자신의 코드를 기반으로 반환 값을 설정합니다. 마지막에 다음을 사용하십시오 :

eventArgs.ReturnValue = GetValue(x,y); 
eventArgs.FlowBehavior = FlowBehavior.Return; 

원래 Get/Set 호출을 효과적으로 차단합니다.

동일한 패턴을 사용하여 캐시 측면을 보여주는 this blog을 참조하십시오 ...