我正在尝试编写一个函数,使DataRow [column]返回可以为空的类型数据。 例如: 如果我有财产
int? iValue { get; set; }
并且DataRow [“ID”]将在数据库中具有int ID 我想创建一个包装器函数,它将检查DataRow [“ID”]的值是否为DBnull并将iValue设置为null。等等其余的数据类型。 我写了以下函数
public static void CDB<T>(ref T tData, object objDBDataItem)
{
if (objDBDataItem.GetType().FullName == "System.DBNull")
tData = default(T);
tData = (T)objDBDataItem;
}
调用函数我执行以下操作
CDB(ref iValue , DataRow["ID"]);
这应该将iValue的值初始化为DataRow [“ID”]的整数值,如果DB中的值为null,则为null。 问题是这个代码不起作用,因为我不允许通过proprities作为参考。 但我的想法是,我不想把这个功能称为
iValue = CDB<int>(DataRow["ID"]);
到目前为止,如果我将其更改为以
格式调用,我能够使该功能正常工作iValue = CDB(iValue, DataRow["ID"]);
但我不喜欢我需要重复iValue的想法(一次获取Type和一次以便我为其分配返回值。
任何暗示?
答案 0 :(得分:1)
一个选项是将委托传递给您的函数:
public static void CDB<T>(object objDBDataItem, Action<T> setter)
{
T data;
if (objDBDataItem is System.DBNull)
tData = default(T);
else
tData = (T)objDBDataItem;
setter(data);
}
并称之为:
CDB(DataRow["ID"], (int? i) => iValue = i);
值得指出的是,您隐藏DBNull
所描述的逻辑已由System.Data.DataRowExtensions.Field提供:
iValue = DataRow.Field<int?>("ID");
出于好奇,你为什么不喜欢用这种方式分配iValue
?