Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对任何具有Parse实现的T使用Parse()进行数据验证_C#_Validation - Fatal编程技术网

C#对任何具有Parse实现的T使用Parse()进行数据验证

C#对任何具有Parse实现的T使用Parse()进行数据验证,c#,validation,C#,Validation,我正在简化我的代码(我喜欢为每个执行的函数编写最少的行),并且我经常遇到冗长的数据验证过程。所以决定用伪代码编写一个验证函数: public static bool Validate(string input, out object output){ // try to parse data try { (TypeOf(object)) output = new (TypeOf(object)); output = (TypeOf(object)).Parse(i

我正在简化我的代码(我喜欢为每个执行的函数编写最少的行),并且我经常遇到冗长的数据验证过程。所以决定用伪代码编写一个验证函数:

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和重载,但是由于我计划在包含Parse方法的类型上使用,在我看来应该有一种实现上述函数的方法。。。我只是不知道我在找什么。我一直在想一个接口,但在实现上失败了


谢谢

框架提供程序已经为您编写了函数,名为
TryParse
。它没有通用性,但它的调用方式与调用
Validate
的方式完全相同。还不如使用已经存在的东西

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

该方法适用于double、int、float、char、DateTime等。您最好创建一个带有重载的静态类(调用
TryParse
,而不是
Parse
,用于所涉及的各种类型。该列表相当短,您唯一的其他选项将非常复杂


或者您可以直接在代码中调用相应版本的
TryParse
。如果您没有插入任何附加验证(因此需要自己的验证类),那么它不会比伪代码更详细。

您可以使用类似的方法(它使用反射):

但它真的是一个奇妙的代码(也许有机会写得更好一点),我永远不会使用它


正如Anthony Pegram所建议的,您应该使用TryParse创建一些重载方法-这是一个更干净、更好的解决方案。

谢谢!每天我都会学到关于这个框架的20到50个新东西。
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;
}