【发布时间】:2012-05-06 07:05:11
【问题描述】:
我正在创建一个通用转换器
这是通用转换器的示例代码
bool TryReaderParse<TType>(object data, out TType value)
{
value = default(TType);
Type returnType = typeof(TType);
object tmpValue = null;
if (returnType == typeof(DateTime))
{
tmpValue = StringToDatetime(data.ToString());
}
else if (returnType == typeof(DateTime?)) // THIS IF FIRES
{
tmpValue = StringToNullableDatetime(data.ToString());
}
value = (TType)Convert.ChangeType(tmpValue, returnType); // THROWS
}
public DateTime? StringToNullableDatetime(string date)
{
DateTime? datetime = null;
if (!string.IsNullOrEmpty(date))
{
datetime = DateTime.Parse(date, new CultureInfo(Resources.CurrentCulture));
}
return datetime;
}
这就是我使用它的方式:
void foo()
{
DateTime? date = null;
TryReaderParse<DateTime?>("25/12/2012", out date);
}
抛出的异常表示它无法从DateTime 转换为Nullable<DateTime>。既然该方法创建并返回一个可为空的类型,那么为什么转换失败了?
最后,在这个特定的示例中,我希望有一个可为空的 DateTime。
edit 问题是StringToNullableDatetime 方法返回一个Datetime? 并且强制转换说不能从Datetime 转换
既然StringToNullableDatetime方法返回一个可以为空的日期时间,那Convert.ChangeType怎么可能看不到传递的参数可以为空呢?
附言。我读过类似this 的答案,相反的答案(从可空值转换)。
【问题讨论】:
标签: c# generics .net-3.5 casting nullable