我正在和TypeDescriptor课谈一谈。
我有一个cookie,其中包含一个日期-日期被转换成一个字符串,然后再使用一些帮助方法返回。
我的主要扩展方法之一是用来进行转换,但是它会抛出一个强制错误,因为日期不能从字符串中转换回。
下面是我输出的信息:
22/01/2015 14:29:15不能转换为DateTime
在我看来就像一个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);
}发布于 2015-01-22 16:43:40
我猜,从您的约会示例来看,您正在en-GB文化中运行。不幸的是,为了从this related q/a中获得自由,IsValid总是使用CultureInfo.InvariantCulture (美国日期格式)来决定它的答案。因此,当在en-GB中使用您的示例这样的日期运行时,IsValid将返回false;但是默认情况下使用当前线程区域性的ConvertFrom将成功!
有趣的是,IsValid在很大程度上回避了这是否真的是一个bug的问题:
IsValid方法用于验证类型内的值,而不是确定值是否可以转换为给定类型。例如,可以使用IsValid来确定给定值对于枚举类型是否有效。
因此,实际上您根本不应该在这里使用IsValid --您应该执行相同的文档所建议的操作:
您可以通过在异常块中包装
ConvertTo和ConvertFrom方法来编写自己的ConvertTo方法。
在这种方法中,您可以确保使用您真正关心的CultureInfo。
https://stackoverflow.com/questions/28093368
复制相似问题