我需要在Datacontract中返回一个结构数组。我无法成功。设置数组的值时收到错误。
这是Datacontract声明:
[DataContract]
public class invoice_data
{
[DataMember]
public Invoice_Body_Item[] invoice_body;
}
[StructLayout(LayoutKind.Sequential)]
public struct Invoice_Body_Item
{
public string Item_Description;
public decimal Item_Value;
}
} 这是方法代码:
invoice_data Invoice = new invoice_data();
object tr_bl = svr.GetInvoiceData(inputparams.ck, svr.Confirm(inputparams.ck));
for (int i = ((Array)(((object[])(tr_bl))[1])).GetLowerBound(0); i <= ((Array)(((object[])(tr_bl))[1])).GetUpperBound(0); i++)
{
Invoice.invoice_body[i].Item_Description = (string)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[0];
Invoice.invoice_body[i].Item_Value = (decimal)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[1];
}
}
在此行中,我收到错误“对象引用未设置为对象的实例。”
Invoice.invoice_body[i].Item_Description = (string)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[0];
解决。谢谢大家的帮助。我做了以下更改:
public Invoice_Body_Item[] fill_invoice_body(object tr_bl)
{
Invoice_Body_Item[] temp = new Invoice_Body_Item[40];
for (int i = 0; i <= ((Array)(((object[])(tr_bl))[1])).GetUpperBound(0); i++)
{
temp[i].Item_Description = (string)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[0];
temp[i].Item_Value = (decimal)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[1];
}
return temp;
}
然后用
调用它 Invoice.invoice_body = fill_invoice_body(tr_bl);
答案 0 :(得分:0)
您的Invoice
实例正在实例化为new invoice_data
对象,然后您正在为invoice_data.invoice_body
集合分配值 - 我看不出为什么您会获得null从提取要赋值的值的代码中引用异常,invoice_data.invoice_body
是否为空?
答案 1 :(得分:0)
invoice_body
的{p> invoice_data
仍为null
。你不能只是声明类型数组的东西,然后使用它,你仍然需要初始化它,所以你不能通过索引访问什么都没有,更别说没有长度了。
要做到这一点:
Invoice.invoice_body = new Invoice_Body_Item[desiredLength];
desiredLength
应该根据您要放入的数量/您想要或将在数组中结束的项目来决定{{1}}。这通常应该根据用于确定循环次数的相同数据来计算。