加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:36:48 所属栏目:百科 来源:网络整理
导读:参见英文答案 Fastest way to check if a string can be parsed5个 我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少
参见英文答案 > 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方法,因为异常是昂贵的(性能).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读