我正在尝试使用System.ComponentModel.TypeConverter将一堆System.Strings转换为不同的类型。这些字符串可能是也可能不是TypeConverter的有效格式,所以我想在尝试类型转换之前找到一种检查其有效性的方法(以避免必须依赖捕获System.FormatException来指示字符串格式不正确。)
很好,这就是TypeConverters有一个IsValid()方法的原因,对吧?好吧,我遇到了一个问题,其中IsValid()将返回true,但是当我调用ConvertFromString()时,它会抛出异常。以下是一些重现问题的代码:
System.ComponentModel.DateTimeConverter DateConversion =
new System.ComponentModel.DateTimeConverter();
String TheNumberZero = "0";
if (DateConversion.IsValid(TheNumberZero))
Console.WriteLine(DateConversion.
ConvertFromString(TheNumberZero).ToString());
else
Console.WriteLine("Invalid.");
当我运行时,行
Console.WriteLine(DateConversion.
ConvertFromString(TheNumberZero).ToString());
抛出带有消息
的System.FromatException0 is not a valid value for DateTime.
如果在尝试进行类型转换之前不检查转换输入,IsValid()方法的目的是什么?有没有什么方法可以检查字符串的有效性,而不必捕获FormatException?
答案 0 :(得分:3)
文档是你的朋友:
IsValid方法用于验证 类型中的值,而不是 确定值是否可以转换为 给定的类型。例如,IsValid 可用于确定是否给定 值对于枚举有效 类型。有关示例,请参阅 EnumConverter。
你可以自己写 WillConvertSucceed方法通过包装 ConvertTo和ConvertFrom方法 在异常块中。
答案 1 :(得分:1)
这是ck建议的代码示例 通常,当您确实需要知道值类型的解析是否有效时,这是要使用的方法。
DateTime convertedDate;
string zero = "0";
if (!DateTime.TryParse(zero, out convertedDate))
{
throw new InvalidCastException(string.Format(
"Attempted Invalid Cast of {0} to DateTime",zero));
}
答案 2 :(得分:-1)
听起来像Int32,DateTime,Decimal等上的TryParse可能会更有用和有效。