Exemplo n.º 1
0
        public override IMessage Invoke(IMessage msg)
        {
            Monitor.Enter(this);
            try {
                var _msg = msg as IMethodCallMessage;
                try {
                    var _args = new object[_msg.ArgCount];
                    for (int i = 0; i < _msg.ArgCount; i++)
                    {
                        _args[i] = _msg.Args[i];
                    }

                    if (_msg.MethodBase.IsSpecialName)
                    {
                        var _name      = _msg.MethodBase.Name.Split(new string[] { "_" }, 2, StringSplitOptions.None);
                        var _eventName = _name[1];
                        switch (_name[0])
                        {
                        case "add":
                            if (this._events.ContainsKey(_eventName))
                            {
                                var _isExist = this._events[_eventName].Handler != null;
                                this._events[_eventName].AddHandler(_args[0] as Delegate);
                                if (_isExist)
                                {
                                    return(new ReturnMessage(null, _args, 0, _msg.LogicalCallContext, _msg));
                                }
                            }
                            else
                            {
                                this._events.Add(_eventName, EventHandlerHelper.Create(_eventName, _args[0] as Delegate, this.Helper));
                            }
                            _args[0] = this._events[_eventName].ProxyHandler;
                            break;

                        case "remove":
                            if (this._events.ContainsKey(_eventName))
                            {
                                this._events[_eventName].RemoveHandler(_args[0] as Delegate);
                                if (this._events[_eventName].Handler != null)
                                {
                                    return(new ReturnMessage(null, _args, 0, _msg.LogicalCallContext, _msg));
                                }
                                _args[0] = this._events[_eventName].ProxyHandler;
                            }
                            break;
                        }
                    }

                    var _result = this.Helper.InvokeHandler(this._instance, _msg.MethodBase, _args);
                    return(new ReturnMessage(_result, _args, 0, _msg.LogicalCallContext, _msg));
                } catch (Exception ex) {
                    return(new ReturnMessage(ex, _msg));
                }
            } finally {
                Monitor.Exit(this);
            }
        }