private QuestionBase <string> GetQuestion(GrpcQuestionBase grpcQuestion)
        {
            var question = new QuestionBase <string>()
            {
                Key          = grpcQuestion.Key,
                Order        = grpcQuestion.Order,
                Checked      = grpcQuestion.Checked,
                AfterBox     = grpcQuestion.AfterBox,
                Label        = grpcQuestion.Label,
                MethodName   = grpcQuestion.MethodName,
                QuestionsKey = grpcQuestion.QuestionsKey,
                Value        = grpcQuestion.Value,
                ControlType  = (ControlType)grpcQuestion.ControlType,
                Type         = (InputType)grpcQuestion.Type,
                Validator    = GetQuestionValidator(grpcQuestion.Validator)
            };

            if (grpcQuestion.Options != null)
            {
                var options = new List <QuestionOption>();
                options.AddRange(grpcQuestion.Options.Select(o => GetQuestionOption(o)));
                question.Options = options;
            }
            switch (grpcQuestion.SelectedFromCase)
            {
            case GrpcQuestionBase.SelectedFromOneofCase.SelectedFromInt:
                question.SelectedFrom = grpcQuestion.SelectedFromInt;
                break;

            case GrpcQuestionBase.SelectedFromOneofCase.SelectedFromDouble:
                question.SelectedFrom = grpcQuestion.SelectedFromDouble;
                break;

            case GrpcQuestionBase.SelectedFromOneofCase.SelectedFromDecimal:
                question.SelectedFrom = CustomTypes.DecimalValue.GetDecimal(grpcQuestion.SelectedFromDecimal);
                break;
            }
            switch (grpcQuestion.SelectedToCase)
            {
            case GrpcQuestionBase.SelectedToOneofCase.SelectedToInt:
                question.SelectedTo = grpcQuestion.SelectedToInt;
                break;

            case GrpcQuestionBase.SelectedToOneofCase.SelectedToDouble:
                question.SelectedTo = grpcQuestion.SelectedToDouble;
                break;

            case GrpcQuestionBase.SelectedToOneofCase.SelectedToDecimal:
                question.SelectedTo = CustomTypes.DecimalValue.GetDecimal(grpcQuestion.SelectedToDecimal);
                break;
            }
            switch (grpcQuestion.FromCase)
            {
            case GrpcQuestionBase.FromOneofCase.FromInt:
                question.From = grpcQuestion.FromInt;
                break;

            case GrpcQuestionBase.FromOneofCase.FromDouble:
                question.From = grpcQuestion.FromDouble;
                break;

            case GrpcQuestionBase.FromOneofCase.FromDecimal:
                question.From = CustomTypes.DecimalValue.GetDecimal(grpcQuestion.FromDecimal);
                break;
            }
            switch (grpcQuestion.ToCase)
            {
            case GrpcQuestionBase.ToOneofCase.ToInt:
                question.To = grpcQuestion.ToInt;
                break;

            case GrpcQuestionBase.ToOneofCase.ToDouble:
                question.To = grpcQuestion.ToDouble;
                break;

            case GrpcQuestionBase.ToOneofCase.ToDecimal:
                question.To = CustomTypes.DecimalValue.GetDecimal(grpcQuestion.ToDecimal);
                break;
            }
            return(question);
        }
        private GrpcQuestionBase GetGrpcQuestion(QuestionBase <string> question)
        {
            var grpcQuestionsBase = new GrpcQuestionBase()
            {
                Key          = question.Key ?? "",
                Order        = question.Order,
                Checked      = question.Checked,
                AfterBox     = question.AfterBox,
                Label        = question.Label ?? "",
                MethodName   = question.MethodName ?? "",
                QuestionsKey = question.QuestionsKey ?? "",
                Value        = question.Value ?? "",
                ControlType  = (GrpcControlType)question.ControlType,
                Type         = (GrpcInputType)question.Type,
                Validator    = GetGrpcQuestionValidator(question.Validator)
            };

            if (question.Options != null)
            {
                grpcQuestionsBase.Options.AddRange(question.Options.Select(o => GetGrpcQuestionOption(o)));
            }
            if (question.SelectedFrom != null)
            {
                if (question.SelectedFrom.GetType() == typeof(int))
                {
                    grpcQuestionsBase.SelectedFromInt = (int)question.SelectedFrom;
                }
                else if (question.SelectedFrom.GetType() == typeof(double))
                {
                    grpcQuestionsBase.SelectedFromDouble = (double)question.SelectedFrom;
                }
                else if (question.SelectedFrom.GetType() == typeof(decimal))
                {
                    CustomTypes.DecimalValue selectedFrom = (decimal)question.SelectedFrom;
                    grpcQuestionsBase.SelectedFromDecimal = new DecimalValue()
                    {
                        Nanos = selectedFrom.Nanos, Units = selectedFrom.Units
                    };
                }
            }
            if (question.SelectedTo != null)
            {
                if (question.SelectedTo.GetType() == typeof(int))
                {
                    grpcQuestionsBase.SelectedToInt = (int)question.SelectedTo;
                }
                else if (question.SelectedTo.GetType() == typeof(double))
                {
                    grpcQuestionsBase.SelectedToDouble = (double)question.SelectedTo;
                }
                else if (question.SelectedTo.GetType() == typeof(decimal))
                {
                    CustomTypes.DecimalValue selectedTo = (decimal)question.SelectedTo;
                    grpcQuestionsBase.SelectedToDecimal = new DecimalValue()
                    {
                        Nanos = selectedTo.Nanos, Units = selectedTo.Units
                    };
                }
            }
            if (question.From != null)
            {
                if (question.From.GetType() == typeof(int))
                {
                    grpcQuestionsBase.FromInt = (int)question.From;
                }
                else if (question.From.GetType() == typeof(double))
                {
                    grpcQuestionsBase.FromDouble = (double)question.From;
                }
                else if (question.From.GetType() == typeof(decimal))
                {
                    CustomTypes.DecimalValue from = (decimal)question.From;
                    grpcQuestionsBase.FromDecimal = new DecimalValue()
                    {
                        Nanos = from.Nanos, Units = from.Units
                    };
                }
            }
            if (question.To != null)
            {
                if (question.To.GetType() == typeof(int))
                {
                    grpcQuestionsBase.ToInt = (int)question.To;
                }
                else if (question.To.GetType() == typeof(double))
                {
                    grpcQuestionsBase.ToDouble = (double)question.To;
                }
                else if (question.To.GetType() == typeof(decimal))
                {
                    CustomTypes.DecimalValue to = (decimal)question.To;
                    grpcQuestionsBase.ToDecimal = new DecimalValue()
                    {
                        Nanos = to.Nanos, Units = to.Units
                    };
                }
            }
            return(grpcQuestionsBase);
        }