用于转换System.Data.DataRow Indexer的返回值的通用算法

时间:2009-10-31 00:20:24

标签: c# generics

我正在尝试编写一个函数,使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和一次以便我为其分配返回值。

任何暗示?

1 个答案:

答案 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