Запретить репликацию кода с помощью лямбда-функций при использовании параметров

Я должен проанализировать содержимое многих TextBox, которые содержат различные числовые типы данных (int, double...) Чтобы быть действительным, текст должен быть не только синтаксическим int, или же dobule или что-то еще, оно также должно быть в определенном диапазоне.

У меня есть эта функция:

    private static bool validateDoubleInRange(TextBox txtBox,
        double rangeMin, double rangeMax,
        string errorMessage, ErrorProvider ep, out double? result)
    {
        double tmpResult;
        if (double.TryParse(txtBox.Text, out tmpResult))
        {
            // Ok it's a double but is it valid?
            if (tmpResult > rangeMin && tmpResult < rangeMax)
            {
                // Yes it is
                result = tmpResult;
                ep.SetError(txtBox, string.Empty);
                return true;
            }
            else
            {
                // No
                result = null;
                ep.SetError(txtBox, errorMessage);
                return false;
            }
        }
        else
        {
            // Not even a double
            result = null;
            ep.SetError(txtBox, errorMessage);
            return false;
        }
    }

Это работает для полей, которые я знаю, должны содержать double, Разобрать поле, которое должно содержать int мне нужно было бы написать функцию, которая практически идентична, за исключением double.TryParse(string, out double) это станет int.TryParse(string, out int) и подпись функции, которая будет меняться от out double? в out int?

Я создал делегат, который будет использоваться вместо конкретного типа type.TryParse(...):

private delegate bool GenericTryParse(TextBox txtBox, out ??? result);

предыдущая функция будет содержать дополнительный параметр, который будет иметь тип GenericTryParse

И звонок (int версия) станет:

validateGenericNumberInRange(txtBox, 0, 100, errorMessage, ep,
 (TextBox tb, out int r) => { return int.TryParse(tb.Text, out r)?true:false; },
 out result);

Проблема в том, что я все еще связан с out Тип параметра, я не могу (или не знаю, как) объявить GenericTryParse без указания out тип результата.

Есть ли способ обойти эту проблему, как бы вы это сделали?

1 ответ

Решение

Вы ищете дженерики:

private delegate bool GenericTryParse<T>(TextBox txtBox, out T result);
Другие вопросы по тегам