Что касается вопроса 2, возможно, можно обойти его, предоставив другой интерфейс для потребителей кода. Вместо предоставления открытого класса, который реализует IDisposable
, и надеясь, что они обернут его в using
, вы могли бы предоставить статический метод, который принимает функцию для выполнения в «подавленном» контексте:
public static class EventSuppressor {
public void Suppress(Action action) {
using (var s = new SuppressActions()) {
action();
}
}
private class SuppressActions : IDisposable {
...
}
}
Тогда потребители могут использовать это следующим образом:
EventSuppressor.Suppress(() => {
// OnChange events fired here are ignored
}) // OnChange events enabled again
Конечно, вы должны выяснить, подходит ли этот дизайн, так как это приведет к дополнительным вызовам функций, классам, сгенерированным компилятором, замыканиям и т. Д.