Хорошее решение ... Я должен обдумать это. +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
подпись события.