Exemplo n.º 1
0
        private static bool InvokeHandler(Entity admin, CommandArguments args, object handler, CommandHandlerInfo handlerInfo)
        {
            if (handlerInfo.Parameters.Length == 0)
            {
                return((bool)handlerInfo.Method.Invoke(handler, new object[0]));
            }

            var objects = new List <object>();

            // 첫 번재 인자로 admin을 요청할 경우에는 admin을 넣어준다.
            if (handlerInfo.Parameters[0].ParameterType == typeof(Entity))
            {
                objects.Add(admin);
            }

            for (var index = 1; index < handlerInfo.Parameters.Length; ++index)
            {
                var argsIndex = index - 1;
                var parameter = handlerInfo.Parameters[index];

                var    isAfterAll = false;
                object value      = null;

                // CommandArgument의 속성에 따라 value를 미리 구해본다.
                if (parameter.IsOptional)
                {
                    value = parameter.Default;
                }

                if (parameter.IsAfterAll)
                {
                    // AfterAll은 꼭 마지막에 와야한다.
                    Debug.Assert(index == handlerInfo.Parameters.Length - 1);
                    value      = args.GetAll(argsIndex);
                    isAfterAll = true;
                }

                // Attribute로부터 값을 구하지 못했고, 입력된 args도 없다면 인자 부족으로 종료한다.
                if (args.Count <= argsIndex)
                {
                    if (value == null)
                    {
                        return(false);
                    }
                }
                else
                {
                    // AfterAll이 아니면 값을 가져올 수 있다.
                    if (!isAfterAll)
                    {
                        // Entity 형일 경우 int를 받아서 Entity를 가져온다.
                        if (parameter.ParameterType == typeof(Entity))
                        {
                            if (!args.Is <int>(argsIndex))
                            {
                                return(false);
                            }

                            var targetEntityId = args.Get <int>(argsIndex);
                            var targetEntity   = EntityManager.Instance.At(targetEntityId);
                            if (targetEntity == null)
                            {
                                return(false);
                            }

                            value = targetEntity;
                        }
                        else
                        {
                            // 잘못된 인자가 넘어왔다면 인자 오류로 종료한다.
                            if (!args.IsType(argsIndex, parameter.ParameterType))
                            {
                                return(false);
                            }

                            value = args.GetValue(argsIndex, parameter.ParameterType);
                        }
                    }
                }

                objects.Add(value);
            }

            return((bool)handlerInfo.Method.Invoke(handler, objects.ToArray()));
        }
Exemplo n.º 2
0
        private static bool InvokeHandler(Entity admin, CommandArguments args, object handler, CommandHandlerInfo handlerInfo)
        {
            if (handlerInfo.Parameters.Length == 0)
                return (bool) handlerInfo.Method.Invoke(handler, new object[0]);

            var objects = new List<object>();

            // 첫 번재 인자로 admin을 요청할 경우에는 admin을 넣어준다.
            if (handlerInfo.Parameters[0].ParameterType == typeof (Entity))
                objects.Add(admin);

            for (var index = 1; index < handlerInfo.Parameters.Length; ++index)
            {
                var argsIndex = index - 1;
                var parameter = handlerInfo.Parameters[index];

                var isAfterAll = false;
                object value = null;

                // CommandArgument의 속성에 따라 value를 미리 구해본다.
                if (parameter.IsOptional)
                    value = parameter.Default;

                if (parameter.IsAfterAll)
                {
                    // AfterAll은 꼭 마지막에 와야한다.
                    Debug.Assert(index == handlerInfo.Parameters.Length - 1);
                    value = args.GetAll(argsIndex);
                    isAfterAll = true;
                }

                // Attribute로부터 값을 구하지 못했고, 입력된 args도 없다면 인자 부족으로 종료한다.
                if (args.Count <= argsIndex)
                {
                    if (value == null)
                        return false;
                }
                else
                {
                    // AfterAll이 아니면 값을 가져올 수 있다.
                    if (!isAfterAll)
                    {
                        // Entity 형일 경우 int를 받아서 Entity를 가져온다.
                        if (parameter.ParameterType == typeof (Entity))
                        {
                            if (!args.Is<int>(argsIndex))
                                return false;

                            var targetEntityId = args.Get<int>(argsIndex);
                            var targetEntity = EntityManager.Instance.At(targetEntityId);
                            if (targetEntity == null)
                                return false;

                            value = targetEntity;
                        }
                        else
                        {
                            // 잘못된 인자가 넘어왔다면 인자 오류로 종료한다.
                            if (!args.IsType(argsIndex, parameter.ParameterType))
                                return false;

                            value = args.GetValue(argsIndex, parameter.ParameterType);
                        }
                    }
                }

                objects.Add(value);
            }

            return (bool) handlerInfo.Method.Invoke(handler, objects.ToArray());
        }