基于属性的属性拦截.怎样

本文关键字:属性 怎样 于属性 | 更新日期: 2023-09-27 18:23:45

我有一个实体的抽象类,负责为每个实体实例生成和返回一个唯一的键。密钥生成成本有点高,并且基于具体实体的属性值。我已经用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; }
}

每次属性值更改时,我都需要使KeyMemberAttributeEntityBase.Key设置为null

基于属性的属性拦截.怎样

看看面向方面编程(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。