2014-09-21 6 views
0

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

ответ

2

Посмотрите на платформу Aspect Oriented Programming (AOP), такую ​​как PostSharp. PostSharp позволяет создавать атрибуты, которые можно использовать для оформления классов, методов ... и т. Д.

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

, например с PostSharp вы можете определить атрибут как:

[Serializable] 
public class KeyMemberAttribute : LocationInterceptionAspect 
{ 

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

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

+0

Спасибо. Просто были некоторые проблемы с размышлениями. Однако из-за того, что другой подход с этим подходом из-за вашего примера кода привел меня к нахождению этого: http://doc.postsharp.net/multicast-reflection –

 Смежные вопросы

  • Нет связанных вопросов^_^