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);
}
}