2013-05-24 3 views
0

Datacontract에서 구조체 배열을 반환해야합니다. 나는 그것을 할 수 없다. 배열 값을 설정할 때 오류가 발생합니다.WCF 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); 
+1

캐스팅 량이 문제 일 수 있다고 생각합니다. 코드를 단순화하십시오. – Romoku

+0

이 코드에는 괄호 안의 단어가 있습니다. –

+0

고맙지 만 실제로는 물체의 형변환을 단순화하는 방법을 모른다. "TEST"와 같은 간단한 문자열에 대한 캐스트를 바꾸면 오류가 계속 나타납니다. – user2386560

답변

0

invoice_body이 예를 주어, 여전히 null입니다. 배열을 배열로 선언 한 다음 사용할 수는 없지만 여전히 초기화해야하므로 아무 것도없는 인덱스로 액세스 할 수 없으므로 길이가 없습니다.

이 작업을 수행하려면 desiredLength이 결정 당신이 거기에/당신이 원하는 또는 배열로 끝날 얼마나 많은 항목을 넣을려고 얼마나을 기반으로해야

Invoice.invoice_body = new Invoice_Body_Item[desiredLength]; 

. 이것은 일반적으로 반복 할 횟수를 결정하는 데 사용되는 동일한 데이터에서 계산할 수 있어야합니다.

+0

잘 해냈다. 고마워. – user2386560

0

귀하의 Invoice 인스턴스가 new invoice_data 객체 인스턴스화되고 있으며, 그런 다음 invoice_data.invoice_body 컬렉션에 값을 할당하고 - 나는 할 수 할당 할 값을 추출하는 코드에서 null 참조 예외가 발생하는 이유를 확인하십시오. 따라서 invoice_data.invoice_body은 null입니까? invoice_data