DelegateFactory.RemoveDelegate C# (CSharp) Method

RemoveDelegate() private method

private RemoveDelegate ( Delegate obj, Delegate dg ) : Delegate
obj Delegate
dg Delegate
return Delegate
    public static Delegate RemoveDelegate(Delegate obj, Delegate dg)
    {
        LuaDelegate remove = dg.Target as LuaDelegate;

        if (remove == null)
        {
            obj = Delegate.Remove(obj, dg);
            return obj;
        }

        LuaState state = remove.func.GetLuaState();
        Delegate[] ds = obj.GetInvocationList();

        for (int i = 0; i < ds.Length; i++)
        {
            LuaDelegate ld = ds[i].Target as LuaDelegate;

            if (ld != null && ld == remove)
            {
                obj = Delegate.Remove(obj, ds[i]);
                state.DelayDispose(ld.func);
                state.DelayDispose(ld.self);
                break;
            }
        }

        return obj;
    }

Same methods

DelegateFactory::RemoveDelegate ( Delegate obj, LuaFunction func ) : Delegate

Usage Example

    static int op_Subtraction(IntPtr L)
    {
        try
        {
            Delegate arg0 = (Delegate)ToLua.ToObject(L, 1);         //不能增加引用计数,否则自身包含的都会增加
            LuaTypes type = LuaDLL.lua_type(L, 2);

            if (type == LuaTypes.LUA_TFUNCTION)
            {
                LuaFunction func = ToLua.ToLuaFunction(L, 2);
                Delegate[]  ds   = arg0.GetInvocationList();

                for (int i = 0; i < ds.Length; i++)
                {
                    LuaDelegate target = ds[i].Target as LuaDelegate;

                    if (target != null && target.func == func && target.self == null)
                    {
                        arg0 = Delegate.Remove(arg0, ds[i]);
                        if (arg0 != null)
                        {
                            arg0.AddRef();                                            //产生新的委托需要增加计数
                        }
                        break;
                    }
                }

                func.Dispose();
                ToLua.Push(L, arg0);
                return(1);
            }
            else
            {
                Delegate arg1 = (Delegate)ToLua.CheckObject(L, 2);
                arg0 = DelegateFactory.RemoveDelegate(arg0, arg1);
                ToLua.Push(L, arg0);

                return(1);
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
All Usage Examples Of DelegateFactory::RemoveDelegate