通常,当我尝试执行此操作时,这是因为我想设置属性或将其保留为默认值。借助这个答案和dynamic
类型,我们可以轻松地创建一个字符串扩展方法,以使它保持一行简单。
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));