/// <summary> /// Позволяет произвести позднее связывание обработчика сигнала с сигналом /// </summary> /// <param name="smType">Тип обработчика сигнала</param> /// <param name="module">Экземпляр в котором находится обработчик</param> /// <param name="methodName">Обработчик сигнала</param> /// <param name="signal">Сигнал</param> public static void AppendMethod(SignalHandlerType smType, object module, string methodName, object signal) { Contract.Requires(module != null, "Не передан экземпляр класса"); Contract.Requires(signal != null, "Не передан объект выступающий в роли сигнала"); Contract.Requires(!String.IsNullOrWhiteSpace(methodName), "Не передано имя метода, обработчика сигнала"); if (!Stopped) { var methods = module.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); foreach (var method in methods.Where(m => m.Name.Equals(methodName))) { switch (smType) { case SignalHandlerType.SignalHandler: RegisterHandler(signal, module, method); break; case SignalHandlerType.SignalCompletedHandler: RegisterCompletedHandler(signal, module, method); break; case SignalHandlerType.SignalExceptionHandler: RegisterExceptionHandler(signal, module, method); break; } } } }
/// <summary> /// Позволяет произвести позднее связывание обработчика сигнала с сигналом /// </summary> /// <param name="smType">Тип обработчика сигнала</param> /// <param name="handler">Делегат-обработчик</param> /// <param name="signal">Сигнал</param> public static void AppendMethod(SignalHandlerType smType, Delegate handler, object signal) { Contract.Requires(handler != null, "Не передан обработчик сигнала"); Contract.Requires(signal != null, "Не передан объект выступающий в роли сигнала"); if (!Stopped) { switch (smType) { case SignalHandlerType.SignalHandler: RegisterHandler(signal, handler); break; case SignalHandlerType.SignalCompletedHandler: RegisterCompletedHandler(signal, handler); break; case SignalHandlerType.SignalExceptionHandler: RegisterExceptionHandler(signal, handler); break; } } }
public static void RegisterAsHandler(this Delegate handler, SignalHandlerType handleType, object signalKey) { Signal.AppendMethod(handleType, handler, signalKey); }