【问题标题】:C# TypeConverters and IsValidC# TypeConverters 和 IsValid
【发布时间】:2009-12-07 18:55:59
【问题描述】:

我正在尝试使用 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?

【问题讨论】:

    标签: c# .net types typeconverter


    【解决方案1】:

    文档是你的朋友:

    IsValid 方法用于验证 类型中的值,而不是 确定值是否可以转换为 给定的类型。例如,IsValid 可用于确定给定的 值对枚举有效 类型。例如,请参见 枚举转换器。

    你可以自己写 WillConvertSucceed 方法通过包装 ConvertTo 和 ConvertFrom 方法 在异常块中。

    【讨论】:

    • 这是否意味着不借助异常处理就无法提前解决这个问题?
    • @plinth 哈哈!那么,他们没有修复将近五年前报告的错误,而是更改了文档?原始文档 msdn.microsoft.com/en-us/library/… 仅声明:“返回给定的值对象是否对此类型有效。”因此,从该语句推断,IsValid 函数应该告诉我们任何给定值在 ConvertFrom 和 ConvertTo 方法的上下文中是否有效。
    • @Pavel Minaev、@brian、@Paulo Santos:看起来他们在 .NET 4.0 中修复了这个问题 (msdn.microsoft.com/en-us/library/tez461eb(v=VS.100).aspx)
    • 确实如此,Connect 中也记录了这一点。
    【解决方案2】:

    这是 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));
            }
    

    【讨论】:

      【解决方案3】:

      Int32、DateTime、Decimal 等上的 TryParse 之类的声音可能更有用、更高效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 2010-09-27
        • 2011-08-17
        相关资源
        最近更新 更多