Перехват свойств на основе атрибутов. Как?

У меня есть абстрактный класс для сущностей, которые отвечают за генерацию и возврат уникального ключа для каждого экземпляра сущности. Генерация ключа немного затратна и основана на значениях свойств конкретного объекта. Я уже отмечаю свойства, участвующие в генерации ключа, KeyMemberAttribute так что все, что мне нужно, это сделать EntityBase.Key = null каждый раз, когда свойство украшается KeyMemberAttribute изменения.

Итак, я получил базовый класс так:

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.Key в null каждый раз, когда значение свойства изменяется.

1 ответ

Решение

Взгляните на структуру аспектно-ориентированного программирования (AOP), такую ​​как PostSharp. PostSharp позволяет вам создавать атрибуты, которые вы можете использовать для украшения классов, методов... и т. Д.

Такой атрибут может быть запрограммирован на внедрение кода до того, как ваш установщик выполнится и после его завершения.

например, с помощью postSharp вы можете определить свой атрибут следующим образом:

[Serializable] 
public class KeyMemberAttribute : LocationInterceptionAspect 
{ 

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

Так что при каждом звонке на любую недвижимость, украшенную KeyMemberAttribute Ваш ключ будет установлен в ноль.

Другие вопросы по тегам