【发布时间】:2013-05-23 20:23:16
【问题描述】:
我需要在 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];
【问题讨论】:
-
您的 GetInvoiceData 方法是什么样的?
-
GetInvoiceData 是一个来自 COM 对象的方法,它返回发票结构 (tr_bl)
-
那么,为什么不使用COM方法返回的结构呢?
-
tr_bl,从 COM 对象返回的结构,有几个“部分”,如 invoice_header、invoice_body、invoice_details...等。我需要在 WCF 服务中传递所有这些结构。我对 C# 很陌生,有没有办法直接传递 tr_bl 而无需使用 [DataContract] 和 [Datamember] 声明整个结构???例如 invoice_body 必须有项目(描述和价值),并且有 n 个可以返回的值,例如:项目 A,5.00; B项,10.50; C项,2.40;等等……
-
@user2386560 疯狂的想法...您为什么要尝试传递非托管 obj,为什么不直接将所需的数据提取到托管 obj 中并传递呢?...也许会甚至可以解释为什么您会收到 null ref 异常
标签: c# arrays wcf struct datacontract