public static void BindingEvents(Control src, Control dst)
        {
            if (src == null)
            {
                throw new ArgumentNullException(nameof(src));
            }
            if (dst == null)
            {
                throw new ArgumentNullException(nameof(dst));
            }

            Type t = typeof(Control);

            EventHandlerList srcEvents = (EventHandlerList)t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(src);
            EventHandlerList dstEvents = (EventHandlerList)t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(dst);

            foreach (EventInfo eventInfo in t.GetEvents(BindingFlags.Public | BindingFlags.Instance))
            {
                if (eventInfo.Name == "Disposed" || eventInfo.Name == "EventControlAdded")
                {
                    continue;
                }
                FieldInfo fieldInfo = t.GetField("Event" + eventInfo.Name, BindingFlags.NonPublic | BindingFlags.Static)
                                      ?? t.GetField("Event" + _suffixReg.Replace(eventInfo.Name, ""), BindingFlags.NonPublic | BindingFlags.Static); //winforms ♥
                object field = fieldInfo.GetValue(null);

                HandlerRouter router      = new HandlerRouter(field, dstEvents, dst, src, eventInfo.Name);
                MethodInfo    handlerInfo = router.GetType().GetMethod("Invoke", new Type[] { typeof(object), typeof(EventArgs) });
                Delegate      deleg       = Delegate.CreateDelegate(eventInfo.EventHandlerType, router, handlerInfo, true);
                //надо создать делегат задано сигнатуры
                //Delegate combine = Delegate.Combine(deleg, dstEvents[field]);
                srcEvents.AddHandler(field, deleg);
                //eventInfo.AddEventHandler(src, deleg);
            }
        }
        public static void BindingConcreteEvents(this Control src, Control dst)
        {
            if (src == null)
            {
                throw new ArgumentNullException(nameof(src));
            }
            if (dst == null)
            {
                throw new ArgumentNullException(nameof(dst));
            }

            Type t = typeof(Control);

            EventHandlerList srcEvents = (EventHandlerList)t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(src);
            EventHandlerList dstEvents = (EventHandlerList)t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(dst);

            string[] eventNames = { "MouseMove", "MouseDown", "MouseClick", "MouseUp", "MouseCaptureChanged", "KeyDown", "KeyPress", "KeyUp" };

            foreach (EventInfo eventInfo in t.GetEvents(BindingFlags.Public | BindingFlags.Instance).Where(e => eventNames.Contains(e.Name)))
            {
                FieldInfo fieldInfo = t.GetField("Event" + eventInfo.Name, BindingFlags.NonPublic | BindingFlags.Static)
                                      ?? t.GetField("Event" + _suffixReg.Replace(eventInfo.Name, ""), BindingFlags.NonPublic | BindingFlags.Static);


                object field = fieldInfo.GetValue(null);
                if (src.Parent != null && (srcEvents[field]?.GetInvocationList().Any(d => (d.Target as HandlerRouter)?.Destination == src.Parent) ?? false))
                {
                    return;
                }
                HandlerRouter router      = new HandlerRouter(field, dstEvents, dst, src, eventInfo.Name);
                MethodInfo    handlerInfo = router.GetType().GetMethod("Invoke", new Type[] { typeof(object), typeof(EventArgs) });
                Delegate      deleg       = Delegate.CreateDelegate(eventInfo.EventHandlerType, router, handlerInfo, true);
                srcEvents.AddHandler(field, deleg);
            }
        }