Bike.Interpreter.Interpreter.AssignSwitch C# (CSharp) Метод

AssignSwitch() приватный Метод

private AssignSwitch ( string @operator, object target, Node suffix, Func lvThunk, Func rvThunk, bool staticDotNetAssign = false ) : object
@operator string
target object
suffix Node
lvThunk Func
rvThunk Func
staticDotNetAssign bool
Результат object
        private object AssignSwitch(string @operator, object target, Node suffix,
                                    Func<object> lvThunk, Func<object> rvThunk,
                                    bool staticDotNetAssign = false)
        {
            switch (@operator)
            {
                case "=":
                    {
                        return PerformAssign(target, suffix, rvThunk(), staticDotNetAssign);
                    }
                case "*=":
                    {
                        var result = OpMultiply(lvThunk(), rvThunk());
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "/=":
                    {
                        var result = OpDivide(lvThunk(), rvThunk());
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "%=":
                    {
                        var result = Modulus(lvThunk(), rvThunk());
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "+=":
                    {
                        var rv = rvThunk();
                        if (rv is BikeFunction)
                        {
                            var fieldName = suffix.SuffixValue(this);
                            AddHandler(target, fieldName, (BikeFunction)rv, this, staticDotNetAssign);
                            var eventInfo = staticDotNetAssign
                                ? ((Type)target).GetEvent(fieldName)
                                : target.GetType().GetEvent(fieldName);
                            // if delegate, return its value; if event, return null
                            return eventInfo != null ? null : lvThunk();
                        }
                        var result = OpAdd(lvThunk(), rv);
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "-=":
                    {
                        var result = OpMinus(lvThunk(), rvThunk());
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "||=":
                    {
                        var result = OpOr(lvThunk(), rvThunk);
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                case "&&=":
                    {
                        var result = OpAnd(lvThunk(), rvThunk);
                        return PerformAssign(target, suffix, result, staticDotNetAssign);
                    }
                default:
                    throw ErrorFactory.CreateInvalidProgramError(string.Format("Invalid operator {0}", @operator));
            }
        }