Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种简洁的方法来比较nullable和dbnullable对象?_C# - Fatal编程技术网

C# 是否有一种简洁的方法来比较nullable和dbnullable对象?

C# 是否有一种简洁的方法来比较nullable和dbnullable对象?,c#,C#,我有这样的代码: foreach (DataRow row in dataTable.Rows) { if ((string)row["Forename"] != record.Forename) { // Do something } } 工作很好,但是如果行[“Forename”]在数据库中是null,它实际上在这里是DBNull,它不能将DBNull转换为字符串,也不能执行DBNull和string之间的比较。有

我有这样的代码:

foreach (DataRow row in dataTable.Rows)
{
        if ((string)row["Forename"] != record.Forename)
        { 
             // Do something
        }
}
工作很好,但是如果
行[“Forename”]
在数据库中是
null
,它实际上在这里是
DBNull
,它不能将
DBNull
转换为字符串,也不能执行
DBNull
string
之间的比较。有些值也可以是
null
,它无法将
DBNull
int?
进行比较


有没有一个助手方法可以让我进行很好的比较,还是我必须自己编写一个扩展方法?

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

public static T GetField<T>(this DataRow row,string columnName)
{
    object value = row[columnname];
    return (value != DbNull.Value)? (T)value : default(T);
}
publicstatict GetField(此数据行,字符串列名)
{
对象值=行[列名称];
返回值(value!=DbNull.value)?(T)值:默认值(T);
}
然后你可以用

if (row.GetField<string>(columnname) != record.Forename)
{ 
     // Do something
}
if(row.GetField(columnname)!=record.Forename)
{ 
//做点什么
}
此扩展还应支持可为空的类型

var value = row.GetField<int?>(columnname);
var value=row.GetField(columnname);
与我们的实现的唯一区别是,当我们尝试将
DbNull.Value
强制转换为任何值类型(可为null的类型除外)时,它将引发异常。在这种情况下,此方法将返回默认值。

您可以使用支持可为null的类型的扩展方法:

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

是否尝试使用Convert.ToString(行[“Forename”])和Convert.ToInt32()?
foreach (DataRow row in dataTable.Rows)
{
    if(row.IsNull("Forename"))
    {
        // ...
    } 
    else
    {
        string foreName = row.Field<string>("Forename");
        Console.Write("ForeName: " + foreName);
    }
}