通常、これを実行しようとしているのは、プロパティを設定するか、デフォルト値のままにしておきたいためです。この回答とdynamic
タイプの助けを借りて、文字列拡張メソッドを簡単に作成して、1行でシンプルに保つことができます。
public static dynamic ParseAny(this string text, Type type)
{
var converter = TypeDescriptor.GetConverter(type);
if (converter != null && converter.IsValid(text))
return converter.ConvertFromString(text);
else
return Activator.CreateInstance(type);
}
そのように使用します。
bd.Budget = objReader[i].ToString().ParseAny(typeof(double));
int intTest = "1234".ParseAny(typeof(int));
double doubleTest = "12.34".ParseAny(typeof(double));
decimal pass = "12.34".ParseAny(typeof(decimal));
decimal fail = "abc".ParseAny(typeof(decimal));
string nullStr = null;
decimal failedNull = nullStr.ParseAny(typeof(decimal));
オプション
ちなみに、それが可能であればSQLDataReader
、GetSafeString
拡張機能を利用して、リーダーからのnull例外を回避することもできます。
public static string GetSafeString(this SqlDataReader reader, int colIndex)
{
if (!reader.IsDBNull(colIndex))
return reader.GetString(colIndex);
return string.Empty;
}
public static string GetSafeString(this SqlDataReader reader, string colName)
{
int colIndex = reader.GetOrdinal(colName);
if (!reader.IsDBNull(colIndex))
return reader.GetString(colIndex);
return string.Empty;
}
そのように使用します。
bd.Budget = objReader.GetSafeString(i).ParseAny(typeof(double));
bd.Budget = objReader.GetSafeString("ColumnName").ParseAny(typeof(double));