C#TypeConverters和IsValid

时间:2009-12-07 18:56:00

标签: c# .net types typeconverter

我正在尝试使用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.FromatException
0 is not a valid value for DateTime.

如果在尝试进行类型转换之前不检查转换输入,IsValid()方法的目的是什么?有没有什么方法可以检查字符串的有效性,而不必捕获FormatException?

3 个答案:

答案 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可能会更有用和有效。