我正在尝试获取quickbooks数据库中的项目列表。我有以下代码片段:
IItemServiceRet itemServiceRet = itemRet.ItemServiceRet;
TestItem item = new TestItem();
item.Name = itemServiceRet.Name.GetValue();
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
item.Rate = itemServiceRet.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue().ToString();
item.ItemType = "Service";
item.QBID = itemServiceRet.ListID.GetValue();
item.EditSeq = itemServiceRet.EditSequence.GetValue();
代码失败了:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
"Object reference not set to an instance of an object"
因为QB数据库中的特定服务项没有描述。我很好奇是否有一种“干净”的方法来检查空值而不必让每一行都包含一个if
语句来检查GetValue()
是否返回null?
编辑:在尝试了Andrew Cooper的解决方案之后:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
它仍然抛出异常:
Object reference not set to an instance of an object
如果没有描述,就好像GetValue()根本没有返回任何内容,这没有多大意义。
答案 0 :(得分:3)
您可以使用这样的三元运算符:
item.Desc = itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc == null ? null : itemServiceRet.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
但那很难看。
最好的办法是创建一个辅助方法,它采用任何类型Desc
并包含上述逻辑。
答案 1 :(得分:1)
我认为没有更好的解决方案,因为您无法访问空对象的功能。我通常为我的项目创建一个构造函数来执行检查,所以我只需要执行一次。所以在你的例子中:
TestItem item = new TestItem(itemRet.ItemServiceRet);
构造函数看起来像这样:
public TestItem(IItemServiceRet i)
{
if(i.Name != null) this.Name = i.Name.GetValue();
if(i.ORSalesPurchase != null)
if(i.ORSalesPurchase.SalesOrPurchase != null)
{
if(i.ORSalesPurchase.SalesOrPurchase.Desc != null) this.Desc = i.ORSalesPurchase.SalesOrPurchase.Desc.GetValue();
if(i.ORSalesPurchase.SalesOrPurchase.ORPrice != null)
if(i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price != null) this.Price = i.ORSalesPurchase.SalesOrPurchase.ORPrice.Price.GetValue();
}
}
请记住,这对字符串很有效,因为空字符串通常与空白字段相同,但对于QuickBooks中的数字字段,这可能会导致问题。例如,“发票”行可以包含空白数量字段(为双精度数)。双精度值默认为0.0,但QuickBooks中的空白数量字段被视为数量1.0。这也可能导致日期问题,因为QuickBooks可以有空日期字段。