Реализация WeakEventDelegate - запрос обратной связи

. Я только что реализовал класс WeakEventDelegate в .NET.

Я видел другие статьи о реализации такой вещи в http://code.logos.com/blog/2008/08/event_subscription_using_weak_references.html и http : //blogs.msdn.com/b/greg_schechter/archive/2004/05/27/143605.aspx

Однако реализация, к которой я пришел, менее сложна (хотя и менее гибка) и, похоже, выполняет свою работу. поэтому мне было интересно, что-то я пропустил.

Есть ли какие-либо проблемы со следующей реализацией, кроме ее относительной недостаточной гибкости?

public class WeakEventDelegate 
    where TEventArgs : EventArgs
{
    private readonly WeakReference handlerReference;

    public WeakEventDelegate(Action handler)
    {
        handlerReference = new WeakReference(handler);
    }

    public void Handle(object source, TEventArgs e)
    {
        Action unwrappedHandler = (Action)handlerReference.Target;
        if (unwrappedHandler != null)
        {
            unwrappedHandler.Invoke(source, e);
        }
    }
}

РЕДАКТИРОВАТЬ : Моей единственной целью при написании этого класса было предотвратить неявная ссылка издателя на делегата, чтобы предотвратить сборку мусора подписчика.

Это означает, что вместо записи:

void subscribe()
{
    publisher.RaiseCustomEvent += this.HandleCustomEvent;
}

я бы написал:

private readonly WeakDelegate _customHandler = new WeakDelegate(this.HandleCustomEvent);
void subscribe()
{
    publisher.RaiseCustomEvent += _customHandler.Handle;
}

Основное использование - Я имею в виду, что этот класс предназначен для нескольких классов коллекций (подписчиков), время жизни которых я едва могу контролировать. (Однако один из этих случаев происходит при привязке данных WPF, поэтому он может быть идеальным кандидатом для использования рекомендованной инфраструктуры слабых событий).

5
задан Jean Hominal 4 July 2011 в 20:02
поделиться