Я часто пишу такой код:

MyObject property;
MyObject Property
{
    get { return property; }
    set {
            if (property != null)
                property.Changed -= property_Changed; // unsubscribe from the old value
            property = value;
            property.Changed += property_Changed; // subscribe to the new value
        }
}

Я ищу элегантный способ сделать отказ от подписки автоматическим. Любые идеи?

1
LTR 25 Авг 2011 в 23:15

3 ответа

Лучший ответ

Возможно, использование методов расширений может быть тем, что вы ищете.

Вы можете попробовать что-то подобное.

private MyProperty property;
public MyProperty Property
{
    get { return property; }
    set { property.SubPubValue(value, property_Changed); }
}

private static void property_Changed(object sender, PropertyChangedEventArgs e)
{
    throw new NotImplementedException();
}

public static class Extensions
{
    public static void SubPubValue<T>(this T value, T setValue, PropertyChangedEventHandler property_Changed) where T : MyProperty
    {
        if (setValue != null)
            value.PropertyChanged -= property_Changed;
        value = setValue;
        if (setValue != null)
            value.PropertyChanged += property_Changed;
    }
}
1
Jethro 25 Авг 2011 в 19:42

Это настолько элегантно, насколько вы можете получить с идеей, которую пытаетесь реализовать. Конечно, у вас есть логическая ошибка, заключающаяся в том, что value может быть нулевым при передаче, и, таким образом, property.Changed += property_Changed взорвется.

По сути, если вы назначаете новый объект, вы хотите отказаться от подписки на событие старого элемента и присоединиться к событию нового элемента.

2
Tejs 25 Авг 2011 в 19:22

Может быть что-то вроде этого, если вам действительно нужно отписываться / подписываться при каждом изменении свойства:

MyObject Property
{
    get { return property; }
    set {
            //unsubscribe always, if it's not null 
            if(property !=null)
               property.Changed -= property_Changed;

            //assign value 
            property = value;

            //subscribe again, if it's not null
            if (property != null)                            
                property.Changed += property_Changed; 

        }
}
2
Tigran 25 Авг 2011 в 19:32