如果我在C#中从数据库中获取了一些值,它们就是类型对象。现在我想转换这些值typesafe
,将它们加载到我的对象中,该对象或多或少代表datarow
。所以我认为为扩展对象创建一个通用的扩展方法会很好。
所以我构建了以下内容:
public static T ConvertToType<T>(this object value)
{
T returnValue = default(T);
if (value != DBNull.Value)
{
returnValue = (T)value;
}
return returnValue;
}
所以我可以使用它来转换给定datarow
的不同值,如果数据库存储null
值,我会得到默认类型。
例如:
foreach (DataRow row in myTable.Rows)
{
MyClass myObject = new MyClass();
myObject.Id = row["ID"].ConvertToType<int>();
}
这适用于编译时,但似乎无法将对象强制转换为int
。所以我认为所有的值类型都必须手动处理。
所以我扩展了第一个代码块:
public static T ConvertToType<T>(this object value)
{
T returnValue = default(T);
if (value != DBNull.Value)
{
if (wert is int)
{
rueckgabe = Convert.ToInt32(wert);
}
//else if All Value-Types are following...
else
{
returnValue = (T)value;
}
}
return returnValue;
}
但是可以肯定的是编译器现在告诉我目标类型T不能转换为int
。这很清楚。
有人在那里为这个问题找到了一个很好的解决方案吗?或者这不是我希望的那么简单。
答案 0 :(得分:6)
这已经实施。
你可以row.Field<int>("ID")
扩展方法位于System.Data
命名空间
对于可空字段,您可以执行row.Field<int?>("ID")
,因为.Field为DBNull返回null而不是default(T)
答案 1 :(得分:2)
试试这个: Convert.ChangeType
public static T ConvertTo<T>(this object value)
{
T returnValue = default(T);
if (value is T)
{
returnValue = (T)value;
}
else
{
try
{
returnValue = (T)Convert.ChangeType(value, typeof(T));
}
catch (InvalidCastException)
{
returnValue = default(T);
}
}
return returnValue;
}
也许您应该考虑不在这里捕获InvalidCastException。如果您可以想象默认的类型值可能在程序中有用,那么让调用方法处理异常可能会更好。