【发布时间】: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