Дублирование кода в нескольких пространствах имен и частичных классах

#c# #namespaces #partial-classes #code-duplication #linq-to-xsd

#c# #пространства имен #частичные классы #дублирование кода #linq-to-xsd

Вопрос:

Я использую LinqToXSD для создания моделей документов (кода) на основе клиентских XSD. Поскольку эти XSD имеют общую структуру каждый раз, когда я создаю модель документа, некоторые объекты дублируются. Чтобы предотвратить проблемы с компиляцией, я поместил каждую модель документа в собственное пространство имен. Это отлично сработало.

Но теперь я хочу выполнить некоторую пользовательскую проверку с этими объектами, которые являются общедоступными частичными классами. Итак, я определил IValidate интерфейс с помощью одного Validate() метода. Теперь у меня есть некоторый объект низкого уровня, созданный в нескольких объектных моделях, но каждый в другом пространстве имен.

 namespace1
{
    public partial class foo : XTypedElement
       {........}
}

namespace2
{
    public partial class foo : XTypedElement
       {........}
}
  

Теперь я хочу написать один файл частичного класса, чтобы добавить IValidate интерфейс и Validate() метод во все мои классы foo. Но, конечно, это не сработает, потому что на самом деле это разные объекты. У меня их много из-за сгенерированного кода и библиотеки XSD, используемой для генерации кода.

Если бы я мог просто затенить внутренние компоненты (прочитайте «……»выше), это сработало бы. У меня много foo в разных пространствах имен (и у меня есть foo1 через foo100 каждый с той же проблемой). Мне нужно дублировать код, я знаю, что это запрещено, и я не хочу этого делать. Но, если я это сделаю, я, по крайней мере, не хочу поддерживать так много копий одного и того же кода.

Я вполне уверен, что это можно сделать с помощью Dynamics, но я бы предпочел не идти туда.

Может кто-нибудь предложить какой-нибудь другой способ написания этих методов проверки и не копировать вручную в каждый namespace.class это частичный класс?

Комментарии:

1. Разве вы не можете объединить все foo s, чтобы они действительно были одного типа. Я думаю, что это было бы лучшим решением, поскольку оно также имеет больше смысла. Например, у вас не должно быть двух разных Person классов, которые выглядят одинаково.

2. Конечно, я мог бы, но тогда, если мне когда-нибудь понадобится повторно сгенерировать эти модели документов, мне придется заново выполнить этот очень трудоемкий шаг. И их довольно много. Я бы предпочел использовать объектные модели так же, как они создаются. На самом деле, для меня меньше работы писать отдельные методы проверки в отдельных частичных классах, чем перебирать эти огромные модели документов для повторяющихся объектов. Кроме того, я использую отражение в пространстве имен, и если я объединю все foo в одно пространство имен, мне нужно будет определить конкретный класс и указать на другое пространство имен. Спасибо.

3. Я не знаю LINQ to XSD, но разве вы не можете сгенерировать весь тип из всех схем сразу? Или что-то вроде пространств имен на основе пространств имен XML?

4. Поскольку каждый из XSD верхнего уровня использует одни и те же includes , LinqToXsd генерирует объекты для каждого объекта includes в каждой модели документа. Итак, да, я поместил их в разные пространства имен, чтобы проект компилировался с моделями документов по мере их создания. Но теперь это проблема с частичными классами и кодом проверки. Я знал, что это будет проблемой, и могу с этим смириться. Не стоит вводить динамику или использовать шаблоны.