Перехват свойств на основе атрибутов. Как?
У меня есть абстрактный класс для сущностей, которые отвечают за генерацию и возврат уникального ключа для каждого экземпляра сущности. Генерация ключа немного затратна и основана на значениях свойств конкретного объекта. Я уже отмечаю свойства, участвующие в генерации ключа, 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
Ваш ключ будет установлен в ноль.