检查是否可以将字符串转换为给定类型在C#

参见英文答案 > Fastest way to check if a string can be parsed5个
我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少一个,请让我知道.我正在使用C#4.0,如果有任何版本特定的解决方案可用.

该方法只需要处理“标准”类型(内置值数据类型加上String).我需要评估的唯一自定义类型是在库中定义的特定枚举类型.

我现在有2个解决方案,但两者都不是完美的,所以我希望有一个第三个选项(或者是我错过的框架内置的东西).我非常倾向于解决方案#2,因为使用解决方案#1中的try-catch似乎错误.

解决方案1:使用try / catch Convert.ChangeType()

public Boolean CheckType(String value,Type type)
{
    try
    {
        var obj = Convert.ChangeType(value,type);
        return true;
    }
    catch(InvalidCastException)
    {
        return false;
    }
    catch(FormatException)
    {
        return false;
    }
    catch(OverflowException)
    {
        return false;
    }
    catch(ArgumentNullException)
    {
        return false;
    }
}

解决方案2 if / else链类型检查和TryParse

public Boolean CheckType(String value,Type type)
{
    if (type == typeof(String))
    {
        return true;
    }
    else if (type == typeof(Boolean))
    {
        Boolean b;
        return Boolean.TryParse(value,out b); 
    }
    else if (type == typeof(Int32))
    {
        Int32 i;
        return Int32.TryParse(value,out i); 
    }
    else if (type == typeof(Int64))
    {
        Int64 l;
        return Int64.TryParse(value,out l); 
    }
    // similar code to check all other types 
    // (Int16,UInt32,UInt64,UInt16,Byte,SByte,Single,Double,Decimal,//  Enum,Char,DateTime)
    .
    .
    .
    .
    .
    else
        throw new ArgumentException("Invalid type evaluation");

}

如果输入数据严重混乱或损坏,这种方法可能会在短时间内被称为几百次甚至一千次,所以我担心重复的if / else检查将会拖累性能(我不是在这一点上一定要尝试优化,我只想确保我正在考虑其他选项).

我有两个解决方案的另一个问题是实际上将字符串值转换为预期类型的​​新值,在这两种情况下,我都是吞下了结果.

解决方法

我更喜欢TryParse方法,因为异常是昂贵的(性能).

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...