2014-09-21 9 views
0

모든 Entity 인스턴스의 고유 키를 생성하고 반환하는 엔티티에 대한 추상 클래스가 있습니다. 키 생성은 약간 비싸고 구체적인 엔티티의 속성 값을 기반으로합니다. 이미 키 생성에 참여하는 속성을 KeyMemberAttribute으로 표시하므로 KeyMemberAttribute으로 장식 된 속성이 변경 될 때마다 EntityBase.Key = null로 설정하면됩니다.속성 기반 속성 차단. 방법?

그래서, 내가 지금 같은 기본 클래스있어 : 다음

public abstract class EntityBase : IEntity 
{ 
    private string _key; 
    public string Key { 
     get { 
      return _key ?? (_key = GetKey); 
     } 
     set { 
      _key = value; 
     } 
    } 
    private string GetKey { get { /* code that generates the entity key based on values in members with KeyMemberAttribute */ } }; 
} 

public class Entity : EntityBase 
{ 

    [KeyMember] 
    public string MyProperty { get; set; } 

    [KeyMember] 
    public string AnotherProperty { get; set; } 

} 

을 다음과 같이 나는이 EntityBase.Key 모든 null에를 설정 KeyMemberAttribute을 만들 필요가 구현 구체적인 실체를 가지고 속성 값이 변경되는 시간.

답변

2

PostSharp와 같은 AOP (Aspect Oriented Programming) 프레임 워크를 살펴보십시오. PostSharp를 사용하면 클래스, 메소드 등을 꾸미는데 사용할 수있는 속성을 만들 수 있습니다.

이러한 속성은 설정자가 실행되기 전과 완료된 후에 코드를 주입하도록 프로그래밍 할 수 있습니다. 그래서 KeyMemberAttribute 키가 null로 설정됩니다 장식 재산에 대한 모든 호출에

[Serializable] 
public class KeyMemberAttribute : LocationInterceptionAspect 
{ 

    public override void OnSetValue(LocationInterceptionArgs args) 
    { 
     args.ProceedSetValue(); 
     ((EntityBase)args.Instance).Key=null; 
    } 
} 

:

은 postSharp와 예를 들어, 당신은 같은 당신의 속성을 정의 할 수 있습니다.

+0

감사합니다. 리플렉션에 약간의 문제가있었습니다. 그러나 당신의 코드 예제로 인해이 접근법을 사용하기 때문에 다른 하나를 찾게되었습니다 : http://doc.postsharp.net/multicast-reflection –