PostSharp - автоматизировать подписку на события и добавление коллекции - PullRequest
1 голос
/ 02 июня 2009

Повторяющаяся рутинная задача, которую я хотел бы решить с помощью PostSharp, заключается в подписке на события и добавлении коллекции. Я хотел бы подписать объектную процедуру родителя на событие каждого дочернего объекта (дочерние элементы содержатся в списке). Я также хотел бы добавить все списки от родителя в основной список на родителя. Какой аспект я должен использовать или в каком направлении должен думать?

Пример описанной выше проблемы приведен ниже ...

У меня есть следующий интерфейс:

public interface ITraceable
{
    IList Children {get;set;}
    ChangeStatus Status {get;set;}
    bool IsTraceEnabled {get;set;}
    event EventHandler ChangeHandler
}

При следующих типах статуса:

public enum ChangeStatus
{
    New,
    Modified,
    Added,
    Deleted
}

Структура и реализация вышеперечисленного:

public class Entity : ITraceable
{
    public event EventHandler {get;set;}
    public IList Children {get;set;}
    public ChangeStatus Status {get;set;}
    public bool IsTraceEnabled {get;set;}

    public string Name {get;set;}
    public string Address {get;set;}
    public string Title {get;set;}
    public List<ChildEntity1> ChildEntities {get;set;}
    public List<ChildEntity2> ChildEntities {get;set;}

    public void SubscribeableSub(object sender, EventArgs e)
    {
        Console.WriteLine("Test");
    }
}

public class ChildEntity1 : ITraceable
{
    public event EventHandler {get;set;}
    public IList Children {get;set;}
    public ChangeStatus Status {get;set;}
    public bool IsTraceEnabled {get;set;}

    public string Name1 {get;set;}
    public string Address1 {get;set;}
    public string Title1 {get;set;}
}

public class ChildEntity2 : ITraceable
{
    public event EventHandler {get;set;}
    public IList Children {get;set;}
    public ChangeStatus Status {get;set;}
    public bool IsTraceEnabled {get;set;}

    public string Name2 {get;set;}
    public string Address2 {get;set;}
    public string Title2 {get;set;}
}

Спасибо заранее за любую помощь

1 Ответ

0 голосов
/ 02 июня 2009

Я бы использовал следующий шаблон:

  1. Использовать пользовательскую коллекцию (например, наследовать от Collection). Переопределите InsertItem и подпишитесь на дочерние события оттуда. Конструктор коллекции принимает в качестве параметра родителя. Так что нет необходимости в PostSharp здесь.

  2. Вы можете использовать PostSharp для автоматической реализации некоторых событий, например PropertyChanged (INotifyPropertyChanged). Подробности см. В примере PostSharp.Samples.Binding.

-gael

...