Хорошее решение ... Я должен обдумать это. +1 за этот хороший хак.

я есть следующий класс, который имеет одно публичное событие под названиемLengthChanged:

class Dimension
{
    public int Length
    {
        get
        {
            return this.length;
        }
        set
        {
            if (this.length != value)
            {
                this.length = value;
                this.OnLengthChanged ();
            }
    }

    protected virtual void OnLengthChanged()
    {
        var handler = this.LengthChanged;
        if (handler != null)
        {
            handler (this, System.EventArgs.Empty);
        }
    }

    public event System.EventHandler LengthChanged;

    private int length;
}

Я хотел бы иметь возможность регистрировать / отменять регистрацию обработчиков для этого события в методе с именемObserver, который ничего не знает оDimension класс. Я придумал два сценария, ни один из которых не является действительно удовлетворительным:

Определить интерфейсILengthChanged сLengthChanged событие, а затем убедитесь,Dimension инвентарьILengthChanged, Затем я должен предоставить одну реализациюObserver метод для каждого интерфейса, который я определяю. Это никоим образом не достаточно общий. Я бы очень хотел иметь возможность просто передать ссылку наSystem.EventHandler мероприятие.

использованиеSystem.Action<System.EventHandler> обратные вызовы для регистрации и отмены регистрации обработчика событий вObserver метод, вот так:

class Foo {public void Observer (регистр System.Action, unregister System.Action) {register (this.MyEventHandler);

    // keep track of the unregister callback, so that we can unregister
    // our event handler later on, if needed...
}

private void MyEventHandler(object sender, System.EventArgs e)
{
    ...
}

}

который затем будет вызываться так:

Foo foo = ...;
Dimension dim = ...;

foo.Observer (x => dim.LengthChanged += x, x => dim.LengthChanged -= x);

и который, когда он будет выполнен, действительно завершитLengthChanged событие с внутренним обработчиком событияMyEventHandler, Но это не очень элегантно. Я хотел бы иметь возможность написать это вместо этого:

Foo foo = ...;
Dimension dim = ...;

foo.Observer (dim.LengthChanged);

но я понятия не имею, как этого можно достичь. Может быть, я упускаю что-то действительно очевидное здесь? Я думаю, что некоторыеdynamic каким-то образом магия могла бы добиться цели, но это не привело бы к проверке типов во время компиляции: я не хочу, чтобы пользователиObserver передавать ссылки на события, которые не удовлетворяютSystem.EventHandler подпись события.

Ответы на вопрос(2)

Ваш ответ на вопрос