Проверка данных C # с использованием Parse () для любого T, который имеет реализацию Parse - PullRequest
2 голосов
/ 14 января 2011

Я упрощаю свой код (мне нравится писать наименьшее количество строк для каждой выполняемой функции), и я часто сталкиваюсь с длительным процессом проверки данных. Поэтому решил написать функцию проверки в псевдокоде:

public static bool Validate(string input, out object output){
   // try to parse data
   try {
     (TypeOf(object)) output = new (TypeOf(object));
     output = (TypeOf(object)).Parse(input);
     return true;
   } catch {
     return false;
   }   
}

Так что, если я использую в своем коде для проверки нескольких текстовых полей, это выглядит красиво и очень читабельно:

double var1;
Int32 var2;
byte var3;
if (!Validate(txtDouble.text, var1)) return "Error validating a Double";
if (!Validate(txtInt32.text, var2)) return "Error validating a Int32";
if (!Validate(txtByte.text, var3)) return "Error validating a byte";
// else all data is valid, continue
Process(var1, var2, var3)

Я мог бы создать статический класс Validate и overload для каждого типа, но, поскольку я планирую использовать типы, включающие метод Parse, мне кажется, что должен быть способ реализации вышеуказанной функции ... I просто не знаю, что я ищу. Интерфейс все время приходит мне в голову, но не удается реализовать.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 14 января 2011

Поставщики фреймворков уже написали для вас вашу функцию, она называется TryParse.В этом нет общего характера, но он называется точно так же, как вы называете Validate.Можно также использовать то, что уже есть.

double var1;
if (!double.TryParse(input, out var1)) return "Invalid input";

Этот метод доступен для ваших значений типа double, int, float, char, DateTime и т. Д.

0 голосов
/ 14 января 2011

Вы можете использовать что-то вроде этого (оно использует отражение):

private static void Test()
{
    var r1 = TryParse("23", typeof(int));
    var r2 = TryParse("true", typeof(bool));
}

private static bool TryParse(string valueToParse, Type type)
{
    //there are more then one TryParse method and we need the one with 2 parameters
    var method = type.GetMethods().Where(m => m.Name == "TryParse" && m.GetParameters().Count() == 2).Single();
    var instance = Activator.CreateInstance(type); //create instance of the type
    var result = method.Invoke(null, new object[] { valueToParse, instance });

    return (bool)result;
}

, но это действительно причудливый код (возможно, есть шанс написать его немного лучше;)), и я бы никогда не использовал его.

Как сказал Энтони Пеграм, вам следует создать несколько методов перегрузки с TryParse - это намного более чистое и лучшее решение.

0 голосов
/ 14 января 2011

Вам лучше создать статический класс с перегрузками (который вызывает TryParse вместо Parse для различных задействованных типов. Список довольно короткий, и ваши единственные другие варианты будут замысловатыми.

Или вы можете просто вызвать соответствующую версию TryParse прямо в своем коде. Если вы не вставляете никакой дополнительной проверки (отсюда и необходимость в вашем собственном классе проверки), то она не будет более многословной, чем ваш псевдокод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...