示例#1
0
文件: Signal.cs 项目: sciyoshi/netgir
        public void RemoveDelegate(Delegate d)
        {
            if (tref.Target == null)
                return;

            if (d.Method.IsDefined (typeof (ConnectBeforeAttribute), false)) {
                tref.Target.BeforeSignals [name] = Delegate.Remove (tref.Target.BeforeSignals [name] as Delegate, d);
                if (tref.Target.BeforeSignals [name] == null && before_closure != null) {
                    before_closure.Dispose ();
                    before_closure = null;
                }
            } else {
                tref.Target.AfterSignals [name] = Delegate.Remove (tref.Target.AfterSignals [name] as Delegate, d);
                if (tref.Target.AfterSignals [name] == null && after_closure != null) {
                    after_closure.Dispose ();
                    after_closure = null;
                }
            }
        }
示例#2
0
文件: Signal.cs 项目: sciyoshi/netgir
        void ClosureDisposedCB(object o, EventArgs args)
        {
            if (o == before_closure) {
                before_closure.Disposed -= new EventHandler (ClosureDisposedHandler);
                before_closure.Invoked -= new ClosureInvokedHandler (ClosureInvokedCB);
                if (tref.Target != null)
                    tref.Target.BeforeSignals.Remove (name);
                before_closure = null;
            } else if (o == after_closure) {
                after_closure.Disposed -= new EventHandler (ClosureDisposedHandler);
                after_closure.Invoked -= new ClosureInvokedHandler (ClosureInvokedCB);
                if (tref.Target != null)
                    tref.Target.AfterSignals.Remove (name);
                after_closure = null;
            }

            if (before_closure == null && after_closure == null)
                tref.Signals.Remove (name);
        }
示例#3
0
文件: Signal.cs 项目: sciyoshi/netgir
        public void AddDelegate(Delegate d)
        {
            if (args_type == null)
                args_type = d.Method.GetParameters ()[1].ParameterType;

            if (d.Method.IsDefined (typeof (ConnectBeforeAttribute), false)) {
                tref.Target.BeforeSignals [name] = Delegate.Combine (tref.Target.BeforeSignals [name] as Delegate, d);
                if (before_closure == null) {
                    if (marshaler == null)
                        before_closure = new SignalClosure (tref.Handle, name, args_type);
                    else
                        before_closure = new SignalClosure (tref.Handle, name, marshaler, this);
                    before_closure.Disposed += ClosureDisposedHandler;
                    before_closure.Invoked += ClosureInvokedHandler;
                    before_closure.Connect (false);
                }
            } else {
                tref.Target.AfterSignals [name] = Delegate.Combine (tref.Target.AfterSignals [name] as Delegate, d);
                if (after_closure == null) {
                    if (marshaler == null)
                        after_closure = new SignalClosure (tref.Handle, name, args_type);
                    else
                        after_closure = new SignalClosure (tref.Handle, name, marshaler, this);
                    after_closure.Disposed += ClosureDisposedHandler;
                    after_closure.Invoked += ClosureInvokedHandler;
                    after_closure.Connect (true);
                }
            }
        }