Управление свойством-массивом
От: baranovda Российская Империя  
Дата: 01.06.13 10:04
Оценка:
Утилита xsd.exe при обработке XML-схемы преобразует связи с кардинальностью 0-N в свойства-массивы:

public class A
{
}

public class C
{
}

public class B
{
  private A[] fieldA; // 0..N
  private C[] fieldC; // 0..N

  public A[] A
  {
    get { return fieldA; }
    set { fieldA = value; }
  }

  public C[] C
  {
    get { return fieldC; }
    set { fieldC = value; }
  }
}


Этот код совсем не удобен по понятным причинам — при обращении к свойству-массиву нужно проверять его на null, в массиве сложно добавлять и удалять элементы и т.д. В общем, коллекции и списки горазо удобнее.

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

public class AWrapper
{
  private A innerA;

  public AWrapper(A value)
  {
     innerA = value;
  }
}

public class AWrapperCollection : IEnumerable
{
  private B innerB;
 
  public AWrapperCollection(B value)
  {
     innerB = value;
     if (innerB.fieldA == null) 
       innerB.fieldA = new A[0];
  }

  public AWrapper this[int index]
  {
    get
    {
      return new AWrapper(innerB.fieldA[index]);
    }
  }

  public void Add()...
  public void RemoveAt()...
}

public class BWrapper
{
  private B innerB;

  public AWrapperCollection A { get { return new AWrapperCollection(innerB); }}
}


И таких классов со вложенными свойствами-массивами штук сто.

Решение проблемы в лоб — это написать кучу коллекций-оберток ручками.

Но писать руками две сотни классов-коллекций, выполняющих однотипные действия и проверки лень.

Классы сгенерированные XSD.exe наследуются от object и общих предков не имеют.

Теперь вопрос: можно ли как-то упростить процесс написания коллекций при помощи дженериков без использования reflection? Что-то в голову ничего не приходит.
Re: Управление свойством-массивом
От: fddima  
Дата: 01.06.13 11:36
Оценка:
Здравствуйте, baranovda, Вы писали:

А то что советуют здесь — не работает?
Re[2]: Управление свойством-массивом
От: baranovda Российская Империя  
Дата: 01.06.13 12:07
Оценка:
Здравствуйте, fddima, Вы писали:


F>А то что советуют здесь — не работает?


Пасиба.
Схема сложная со всякими choise и множеством абстрактных типов, svcutil на ней падает, это известная проблема, так что svcutil мне не подходит.

Сейчас копаю xsd2code, которая вроде как умеет вместо массивов генерировать коллекции и листы.
Re[3]: Управление свойством-массивом
От: fddima  
Дата: 01.06.13 13:21
Оценка:
Здравствуйте, baranovda, Вы писали:

F>>А то что советуют здесь — не работает?

Моя ссылка ведет на коммент который даёт ссылку на http://www.stefanbader.ch/xsdcsarr2l-exe-refactor-xsd-array-to-list/ эту тулзу.
Впрочем если xsd2code работает — это будет вариант получше. =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.