【发布时间】:2013-07-02 07:56:14
【问题描述】:
我正在使用 4.0,并试图通过开发一些用于类型转换的辅助方法来简化我的生活。以下方法运行良好。它将从任何字符串转换为其他数据类型。
System.ComponentModel;
public static T Convert<T>(string s)
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));
if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return (T)typeConverter.ConvertFrom(s);
}
return default(T);
}
//calling this method...
var dateTime = MyConverter.Convert<DateTime>("13/07/2013"); // Date format "DD/mm/yyyy"
// Working as expected... Taking "13" as Day, "07" as month
现在以下方法也在同一个类 MyConverter 中,但它不适用于 DateTime:
public static bool CanConvertTo<T>(string s)
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));
if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return typeConverter.IsValid(s);
}
else
return false;
}
这个方法的问题是,它只接受 dateformat : "MM/dd/yyyy"
// This will give exception. It is taking "13" as month, "07" as Day
bool canConvert = MyConverter.CanConvertTo<DateTime>("13/07/2013");
编辑 根据 KeyboardP 的建议,我将方法更改为:
public static bool CanConvertTo<T>(string s)
{
TypeConverter typeConverter;
if (typeof(T) == typeof(DateTime))
{
typeConverter = new DateTimeConverter();
}
else
{
typeConverter = TypeDescriptor.GetConverter(typeof(T));
}
if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return typeConverter.IsValid(s);
}
else
return false;
}
并经过测试。测试结果是:
var date = MyConverter.Convert<DateTime>("13/07/2013"); //return perfect date
var canConvert = MyConverter.CanConvertTo<DateTime>("13/07/2013"); // returned false...
所以DateTimeConverter没有成功
【问题讨论】:
-
听起来像是美国和欧洲日期之间的文化差异。试试 2013 年 13 月 13 日,看看是否会破坏它。
-
如果是文化差异,那么为什么一种方法有效而另一种方法无效?
-
如果你传入一个日期格式更明确的值——“2013 年 6 月 13 日”,会发生什么?我想这两种方法都适用。
-
GetCoverter(typeof(DateTime))将返回一个DateTimeConverter,因此不需要检查。我是说如果要指定格式,则需要采用可选参数。但是,您关于为什么IsValid返回 false,但解析为 true 的问题是一个很好的问题。
标签: c# asp.net .net datetime type-conversion