返回WCF Datacontract中的Struct数组

时间:2013-05-24 14:29:20

标签: c# arrays wcf struct datacontract

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

2 个答案:

答案 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}}。这通常应该根据用于确定循环次数的相同数据来计算。