Запретить репликацию кода с помощью лямбда-функций при использовании параметров
Я должен проанализировать содержимое многих 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);