TypeDescriptor无法识别日期

时间:2015-01-22 16:06:59

标签: c# typedescriptor

我有一个关于TypeDescriptor类的问题。

我有一个包含日期的cookie - 将日期转换为字符串,然后使用一些辅助方法再次返回。

我的一个主要扩展方法用于进行转换,但是它会抛出强制错误,因为日期不能从字符串中转换回来。

这是我输出的消息:

22/01/2015 14:29:15无法转换为DateTime

对我来说看起来像是DateTime!

使用Convert.ToDateTime()可以克服这个问题,所以代码一般都可以。我也将它用于el日期,迄今没有任何问题。

唯一的区别是我在这样的linq语句中转换:

            Set = new SortedSet<TrackedItem>(set
                .Split(';')
                .Select(s =>
                {
                    var parts = s.Split(',');
                    return new TrackedItem(
                           parts[0].ConvertTo<int>(),
                           Convert.ToDateTime(parts[1]));
                }));

有什么想法吗?

    public static T ConvertTo<T>(this object obj, bool throwInvalid = false)
        where T : IConvertible
    {
        // Object does not require converting.
        if (obj is T) return (T)obj;

        // Determine if object can be converted. 
        var type = typeof(T);
        var converter = TypeDescriptor.GetConverter(type);

        var isConvertible = converter != null && converter.IsValid(obj);

        var error = string.Format("'{0}' could not be converted to type {1}", obj, type.Name);

        // If no conversion is available, and defaults not allowed throw an error. 
        (!isConvertible && throwInvalid).ThrowTrue(error);

        // If the object is convertible, convert it, else return the default(T).
        return isConvertible ? (T)converter.ConvertFrom(obj) : default(T);
    }

1 个答案:

答案 0 :(得分:2)

我猜测你的日期示例是否在en-GB文化中运行。不幸的是,要从this related q/a大量抽签,IsValid总是使用CultureInfo.InvariantCulture(美国日期格式)来决定答案。因此,当在en-GB中使用您的示例等日期时,IsValid将返回false;但是ConvertFrom,默认情况下使用当前的线程文化会成功!

有趣的是,the latest docs for IsValid大量对冲这是否真的是一个错误的问题:

  

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

所以你真的不应该在这里使用IsValid - 你应该做同样的文档继续建议:

  

您可以通过包装来编写自己的WillConvertSucceed方法   异常块中的ConvertToConvertFrom方法。

在这种方法中,您可以确保使用您真正关心的CultureInfo