Модульное тестирование того, что событие вызывается в C # с использованием отражения

Я хочу проверить, что установка определенного свойства (или, в более общем случае, выполнение некоторого кода) вызывает определенное событие в моем объекте. В этом отношении моя проблема похожа наМодульное тестирование, что событие вызывается в C #, но мне нужно много этих тестов, и я ненавижу шаблон. Поэтому я ищу более общее решение, используя рефлексию.

В идеале я хотел бы сделать что-то вроде этого:

[TestMethod]
public void TestWidth() {
    MyClass myObject = new MyClass();
    AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}

Для реализацииAssertRaisesEventЯ зашел так далеко:

private void AssertRaisesEvent(Action action, object obj, string eventName)
{
    EventInfo eventInfo = obj.GetType().GetEvent(eventName);
    int raisedCount = 0;
    Action incrementer = () => { ++raisedCount; };
    Delegate handler = /* what goes here? */;

    eventInfo.AddEventHandler(obj, handler);
    action.Invoke();
    eventInfo.RemoveEventHandler(obj, handler);

    Assert.AreEqual(1, raisedCount);
}

Как видите, моя проблема заключается в созданииDelegate соответствующего типа для этого события. Делегат не должен делать ничего, кроме вызоваincrementer.

Из-за всего синтаксического сиропа в C # мое представление о том, как на самом деле работают делегаты и события, немного смутно. Это также первый раз, когда я балуюсь размышлениями. Какая недостающая часть?

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

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