汎用コンバーターを作成しています
これが汎用コンバーターのサンプルコードです
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>
。このメソッドはnull許容型を作成して返すので、なぜキャストが失敗するのでしょうか。
最後に、この特定の例では、null許容のDateTimeが必要です。
編集問題は、StringToNullableDatetime
メソッドがを返しDatetime?
、キャストがから変換できないと言っていることですDatetime
StringToNullableDatetime
メソッドはnull許容の日時を返すのでConvert.ChangeType
、渡された引数がnull許容であることをが認識できない可能性はありますか?
追伸 私は反対のことをするこのような答えを読みました(nullableからのキャスト)。