xsd.exe в C # - любой способ получить ArrayList вместо Array? - PullRequest
1 голос
/ 10 марта 2010

Эта проблема в некоторой степени связана с: Проблема с кодом, сгенерированным XSD.EXE: последовательность элементов генерируется как массив

По сути, я бы предпочел работать с ArrayList в коде C #, а не с массивом. У меня есть коллекция ошибок, и я пишу код для отправки дополнительных ошибок в уже существующую коллекцию ошибок. Или, если я найду первую ошибку, я должен создать экземпляр этого объекта и установить первую ошибку массива. Я не хочу иметь дело с изменением размера массива C #. Кажется, что было бы намного проще просто добавить ArrayList.

Я думаю, что вопрос, на который я ссылался выше, был своего рода вопросом того же, но в моем случае у меня есть сложный тип, а не простой.

В моей схеме есть поле с именем Status, которое содержит это:

<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>

Я использую xsd.exe для создания класса C #.

Я мог бы сделать «Ошибка» отдельной схемой и ссылаться на нее (создание схемы с помощью BizTalk 2006 / R2), если бы это имело какое-либо значение в генерируемом C #.

Сгенерированный класс C # выглядит следующим образом:

private 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

= System.Xml.Schema.XmlSchemaForm.Unqualified)] открытая строка ErrorNumber { получить { return this.errorNumberField; } задавать { this.errorNumberField = value; } }

1 Ответ

1 голос
/ 11 марта 2010

Ну, мне пришлось продолжить, поэтому я использовал 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; 
}
...