是否有一种比较可空和可以为空的对象的简洁方法?

时间:2014-06-02 16:13:27

标签: c#

我有这样的代码:

foreach (DataRow row in dataTable.Rows)
{
        if ((string)row["Forename"] != record.Forename)
        { 
             // Do something
        }
}

效果很好,但如果数据库中row["Forename"]null,那么它实际上是DBNull,它不能将DBNull强制转换为字符串,或执行比较在DBNullstring之间。有些值也是nullable<int>,无法将DBNullint?进行比较

是否有帮助方法可以让我进行更好的比较,还是我必须自己编写扩展方法?

2 个答案:

答案 0 :(得分:5)

您可以使用支持可空类型的DataRow.Field扩展方法:

foreach (DataRow row in dataTable.Rows)
{
    int? id = row.Field<int?>("ID");
    if(id.HasValue)
    {
        Console.Write("ID: " + id.Value);
    }
}

由于string是引用类型,因此默认情况下为null。您可以使用DataRow.IsNull来检查它是否为DBNull.Value

foreach (DataRow row in dataTable.Rows)
{
    if(row.IsNull("Forename"))
    {
        // ...
    } 
    else
    {
        string foreName = row.Field<string>("Forename");
        Console.Write("ForeName: " + foreName);
    }
}

答案 1 :(得分:1)

您可以像这样编写自己的扩展方法

public static T GetField<T>(this DataRow row,string columnName)
{
    object value = row[columnname];
    return (value != DbNull.Value)? (T)value : default(T);
}

然后你可以使用

if (row.GetField<string>(columnname) != record.Forename)
{ 
     // Do something
}

此扩展程序也应支持可空类型

var value = row.GetField<int?>(columnname);

DataRowExtension.Field和我们的实现的唯一区别在于,当我们尝试将DbNull.Value强制转换为任何值类型(除了可空类型)时它将抛出异常,在这种情况下,此方法将返回默认值。