【问题标题】:Return an Array of a Struct in a WCF Datacontract在 WCF 数据合同中返回结构数组
【发布时间】:2013-05-24 14:29:20
【问题描述】:

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

【问题讨论】:

  • 我认为演员的数量可能是你的问题。尽量简化你的代码。
  • 这段代码有括号。
  • 谢谢,但我真的不知道如何简化对象的演员表。如果替换像“TEST”这样的简单字符串的强制转换,仍然会出现错误;

标签: c# arrays wcf struct datacontract


【解决方案1】:

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

为此:

Invoice.invoice_body = new Invoice_Body_Item[desiredLength];

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2022-10-20
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 2013-08-02
      相关资源
      最近更新 更多