我有一个关于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);
}
答案 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
方法 异常块中的ConvertTo
和ConvertFrom
方法。
在这种方法中,您可以确保使用您真正关心的CultureInfo
。