【问题标题】:Return array of struct in Datacontract返回 Datacontract 中的结构数组
【发布时间】: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


【解决方案1】:

你的结构也应该用[DataContract] 装饰 + 用[DataMember] 装饰它的成员:

[StructLayout(LayoutKind.Sequential)]
[DataContract]
public struct Invoice_Body_Item
{
    [DataMember]
    public string Item_Description;
    [DataMember]
    public decimal Item_Value;
}

或者,您可以使用[KnownTypeAttribute(typeof(Invoice_Body_Item))]

【讨论】:

  • 我已经尝试使用 [DataContract] 和 [DataMember],但我仍然在“Invoice.invoice_body[i].Item_Description = (string)((object[])(( (object[])(((object[])(tr_bl))[1]))[i]))[0];"。我应该在哪里使用 [KnownTypeAttribute(typeof(Invoice_Body_Item))]???确实感谢您的帮助
  • 你能把这条线分成尽可能多的线,看看它失败的确切位置吗?
  • 这部分:(string)((object[])(((object[])(((object[])(tr_bl))[1]))[i]))[0 ] 工作正常。尝试设置“Invoice.invoice_body[i].item_Description”的值时失败
  • 您是否 100% 确定在收到请求时发送了一个数组?你调试了吗?你看到你返回的对象了吗?您是否尝试过查看端点之间传递的 xml?
  • 是的,我从 tr_bl 得到一个数组。只是为了检查它,我添加了一些跟踪,我可以看到这些值。问题是当我尝试将这些值传递给 invoice_data 类的 invoice_body 数据成员时。例如,有另一个我没有发布的结构叫做 invoice_header,它有 30 个字段但它不是一个数组,我对此没有任何问题。我得到这个数组的错误。也许这是我想声明的东西。
猜你喜欢
  • 2014-06-02
  • 2018-03-12
  • 2013-08-02
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
相关资源
最近更新 更多