0

我需要在 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);
4

2 回答 2

0

您的Invoice实例被实例化为一个new invoice_data对象,然后您将值分配给invoice_data.invoice_body集合 - 我不明白为什么您会从提取要分配的值的代码中得到一个空引用异常,所以是invoice_data.invoice_body空的?

于 2013-05-24T14:48:56.370 回答
0

invoice_bodyinvoice_data仍然是null,给出这个例子。你不能只声明一个数组类型的东西然后使用它,你仍然需要初始化它,所以你不能通过索引访问什么都没有的东西,更不用说没有长度了。

去做这个:

Invoice.invoice_body = new Invoice_Body_Item[desiredLength];

desiredLength应该根据您要放入多少/您想要或最终将在数组中放入多少项目来决定在哪里。这通常应该可以从用于确定循环次数的相同数据中计算出来。

于 2013-05-24T14:49:15.820 回答