【问题标题】:TypeDescriptor does not recongnise dateTypeDescriptor 无法识别日期
【发布时间】:2015-01-22 16:06:58
【问题描述】:

我对 TypeDescriptor 类有疑问。

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

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

这是我输出的消息:

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

在我看来像一个日期时间!

这个问题可以通过使用Convert.ToDateTime()来解决,所以一般的代码是可以的。我也将它用于其他地方的约会,迄今为止没有任何问题。

唯一的区别是我在这样的 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);
    }

【问题讨论】:

    标签: c# typedescriptor


    【解决方案1】:

    我从您的日期示例中猜测您在 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

    【讨论】:

    • 在 Aakash 上发现 -​​ 删除了 isvalid 并且一切正常。感谢您提供了非常丰富的答案,非常感谢。
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2023-04-09
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多