Am writing unit test for a multi-threading application, where I need to wait until a specific event triggered so that I know the asyn operation is done. E.g. When I call repository.add(something), I wait for event AfterChange before doing any assertion. So I write a util function to do that.
    public static void SyncAction(EventHandler event_, Action action_)
    {
      var signal = new object();
      EventHandler callback = null;
      callback = new EventHandler((s, e) =>
      {
        lock (signal)
        {
          Monitor.Pulse(signal);
        }
        event_ -= callback;
      });
      event_ += callback;
      lock (signal)
      {
        action_();
        Assert.IsTrue(Monitor.Wait(signal, 10000));
      }
    }
However, the compiler prevents from passing event out of the class. Is there a way to achieve that?
UPDATE
Below is the solution using reflection
public static void SyncAction(object target_, string event_, Action action_)
{
  SyncAction(
    new List<Pair<object, string>>() { new Pair<object, string>(target_, event_) },
    action_);
}
public static void SyncAction(IEnumerable<Pair<object, string>> events_, Action action_)
{
  var events = events_
    .Select(a => new Pair<object, EventInfo>(a.First, a.First.GetType().GetEvent(a.Second)))
    .Where(a => a.Second != null);
  var count = events.Count();
  var signal = new object();
  var callback = new EventHandler((s, e) =>
  {
    lock (signal)
    {
      --count;
      Monitor.Pulse(signal);
    }
  });
  events.ForEach(a => a.Second.AddEventHandler(a.First, callback));
  lock (signal)
  {
    action_();
    while (count > 0)
    {
      Assert.IsTrue(Monitor.Wait(signal, 10000));
    }
  }
  events.ForEach(a => a.Second.RemoveEventHandler(a.First, callback));
}