0

我有一个实体的抽象类,负责为每个实体实例生成和返回唯一键。密钥生成有点昂贵,并且基于具体实体的属性值。我已经标记了参与密钥生成的属性,KeyMemberAttribute所以我需要做的就是在EntityBase.Key每次装饰有KeyMemberAttribute更改的属性时使 = 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; }

}

每次属性值更改时,我都需要将其KeyMemberAttribute设置为EntityBase.Keynull

4

1 回答 1

2

查看一个面向方面的编程 (AOP) 框架,例如 PostSharp。PostSharp 允许您创建可用于装饰类、方法等的属性。

这样的属性可以被编程为在你的 setter 执行之前和完成之后注入代码。

例如,使用 postSharp 您可以定义您的属性,例如:

[Serializable] 
public class KeyMemberAttribute : LocationInterceptionAspect 
{ 

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

因此,在每次调用用KeyMemberAttribute您的密钥装饰的任何属性时,都将设置为 null。

于 2014-09-21T21:11:35.543 回答