Утилита 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? Что-то в голову ничего не приходит.
Здравствуйте, baranovda, Вы писали:
А то что советуют
здесь — не работает?
Здравствуйте, fddima, Вы писали:
F>А то что советуют здесь — не работает?
Пасиба.
Схема сложная со всякими choise и множеством абстрактных типов, svcutil на ней падает, это известная проблема, так что svcutil мне не подходит.
Сейчас копаю
xsd2code, которая вроде как умеет вместо массивов генерировать коллекции и листы.
Здравствуйте, baranovda, Вы писали:
F>>А то что советуют здесь — не работает?
Моя ссылка ведет на коммент который даёт ссылку на
http://www.stefanbader.ch/xsdcsarr2l-exe-refactor-xsd-array-to-list/ эту тулзу.
Впрочем если xsd2code работает — это будет вариант получше. =)