参见英文答案 >
Fastest way to check if a string can be parsed5个
我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少一个,请让我知道.我正在使用C#4.0,如果有任何版本特定的解决方案可用.
我必须验证用户输入数据,并确保字符串值可转换为在运行时指定的类型.我不一定需要做实际的转换,只是测试以确保输入值有效.我没有找到一个内置的类或方法来执行这种类型的评估,但如果我缺少一个,请让我知道.我正在使用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检查将会拖累性能(我不是在这一点上一定要尝试优化,我只想确保我正在考虑其他选项).
我有两个解决方案的另一个问题是实际上将字符串值转换为预期类型的新值,在这两种情况下,我都是吞下了结果.