2010-03-10 3 views
1

이 문제는 어느 정도 관련이있다 : Problem with Code Generated by XSD.EXE: Sequence of Elements is Generated as an Arrayxsd.exe to C# - 배열 대신 ArrayList를 가져 오는 방법은 무엇입니까?

기본적으로, 나는 오히려 다음 C# 코드의 ArrayList를 배열과 함께 작동합니다. 오류 컬렉션이 있고 기존 오류 컬렉션에 추가 오류를 다시 전송하는 코드를 작성하고 있습니다. 또는 첫 번째 오류가 발견되면이 개체를 인스턴스화하고 배열의 첫 번째 오류를 설정해야합니다. 나는 C# 배열의 크기를 조정하고 싶지 않다. ArrayList에 추가하는 것이 훨씬 쉬워 진 것 같습니다.

나는 위에서 언급 한 질문은 같은 것을 묻는 질문이라고 생각하지만, 제 경우에는 복잡한 유형이 있습니다. 단순한 유형이 아닙니다.

<xs:element minOccurs="0" name="Errors"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element minOccurs="0" maxOccurs="unbounded" name="Error"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="ErrorNumber" type="xs:string" /> 
      <xs:element name="ErrorMessage" type="xs:string" /> 
     </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

가 나는 C# 클래스를 생성 할 xsd.exe를 사용

내 스키마이 포함되어 상태라는 필드가 있습니다.

"오류"로 별도의 스키마를 만들었을 수 있으며 생성 된 C#에서 차이가 나는 경우 BizTalk 2006/R2로 스키마를 참조했습니다.

생성 C# 클래스는 다음과 같다 :

전용 StatusError [] errorsField;

[System.Xml.Serialization.XmlArrayAttribute(Form 

= System.Xml.Schema.XmlSchemaForm.Unqualified)] [System.Xml.Serialization.XmlArrayItemAttribute ("오류" 폼 = System.Xml.Schema.XmlSchemaForm.Unqualified, ISNULLABLE = false)] public StatusError [] 오류 { 을 얻습니다. { 을 반환합니다. this.errorsField; } 세트 { this.errorsField = value; }}}

[System.CodeDom.Compiler.GeneratedCodeAttribute ("XSD" "2.0.50727.1432")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [ System.ComponentModel.DesignerCategoryAttribute ("코드")] [System.Xml.Serialization.XmlTypeAttribute (AnonymousType = TRUE, 스페이스 = " https://firstrepublic.com/EagleConnect/Status/")] 공용 부분 클래스 StatusError {

private string errorNumberField; 

private string errorMessageField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form 

= 시스템. Xml.Schema.XmlSchemaForm.Unqualified)] 공개 문자열 ErrorNumber { get { return this.errorNumberField; } 세트 { this.errorNumberField = value; } }

+1

그냥 일반적인 질문입니다. 목록 대신 ArrayList를 사용하는 이유는 무엇입니까? – recursive

+0

그건 괜찮을거야, 난 그냥 일반 배열 싶지 않았어. – NealWalters

답변

1

글쎄, 나는 계속했다, 그래서 나는 Array.Resize을 사용했다. 배열을 보려고하는 메소드를 추가했다. 추가하지 않았다면, 거기에 추가하면된다. arrayList는 더 쉽고 빠르다.

// Call the method 
    StatusError newErrorToAdd1 = new StatusError(); 
    newErrorToAdd1.ErrorNumber = "1112"; 
    newErrorToAdd1.ErrorMessage = "Demo error "; 
    transactionRequestOut = AddErrorToTransactionRequest(transactionRequestOut, newErrorToAdd1); 



public static TransactionRequest AddErrorToTransactionRequest(TransactionRequest transReq, StatusError newErr) 
{ 
     int intErrSubscript; 

     // If response is there use it, else add it 
     if (transReq.TransactionResponse == null) 
     { 
      TransactionResponse transactionResponse = new TransactionResponse(); 
      transReq.TransactionResponse = transactionResponse; 
     } 

     // If response/errors are there, use them, else add them 
     if (transReq.TransactionResponse.Status == null) 
     { 
      Status status = new Status(); 
      transReq.TransactionResponse.Status = status; 
     } 
     // If response/errors are there, use them, else add them 
     if (transReq.TransactionResponse.Status.Errors == null) 
     { 
      StatusError[] errors = new StatusError[1]; 
      errors[0] = new StatusError(); 
      intErrSubscript = 0; 
      transReq.TransactionResponse.Status.Errors = errors; 
     } 
     else 
     { 
      int newArraySize = transReq.TransactionResponse.Status.Errors.Length + 1; 
      intErrSubscript = newArraySize - 1; 
      StatusError[] errors = transReq.TransactionResponse.Status.Errors; 
      Array.Resize<StatusError> (ref errors, newArraySize); 
      transReq.TransactionResponse.Status.Errors = errors; 
     } 
     transReq.TransactionResponse.Status.Errors[intErrSubscript] = newErr; 
     return transReq; 
} 
관련 문제