Как написать класс преобразователя? Как эффективно писать правила сопоставления?

У меня есть довольно большой класс A с большим количеством участников, и у меня довольно большой класс B. который может быть построен при наличии объекта A. Объект A может быть построен при наличии объект Б. Мне нужны они оба, так как A — это разновидность ViewModel, которая имеет валидацию и B представляет собой графическое описание, которое можно легко построить.

Как сделать это преобразование?

вот пример, чтобы проиллюстрировать, что я хочу сделать:

class A
{
    string s;
    string t;
    string u;
    string v;

    enum a;
    enum b;
    enum c;
    enum d;
    enum e;

    Dictionary<enum, string> dict;
}


class B
{
    string someString; // is essentially A.a + A.b + A.c + A.s with some rules.
    int someValue; // is essentially dict.TryGetValue(enum.Entry);
    string anotherString;
    //... and lots of others
}

Конечно, просто сделать некоторое сопоставление и создать объект B, и не очень сложно написать простое отображение B => A, инвертируя правила построения А => Б

Итак, вопросы:

  • Существуют ли какие-либо известные шаблоны для достижения этого?
  • Есть ли способ C #по умолчанию делать такие вещи?

Записывать что-то подобное кажется неуместным, это заканчивается сотнями строк кода.

Я думал о каких-то классах преобразователя для частей, как SomeStringConverter, SomeValueConverter,...

  • Как я могу абстрагировать необходимые члены A вместе с правила выполнения сопоставления.
  • Как я могу написать эти правила, чтобы было максимально просто способ выполнения A => B и B => A.

Изменить: Шаблон здесь подразумевается как «лучшие практики», а не как «шаблоны проектирования GoF»

. SomeString в классе B — это своего рода «селектор», он выбирает рисунок варианты, он всегда имеет длину 25 символов, и перечисления в классе A выбирают эти символы, но не 1 на 1 в большинстве случаев.

Скажем, например, :A.a = "Заполнено", A.b = "SingleCoordinate", A.c = "DrawHints" приведет к чему-то вроде SomeString =

 "Y**D***RR****---***---***"

т.е. комбинация важна для получения такой строки, но из комбинации вы можете получить перечисления, которые должны быть установлены в объекте A.

Редактировать2:

Меня особенно интересуют способы использования моих правил отображения для обоих способов, т.е. A.a = "Filled" в сочетании с A.b = "SingleCoordinate" в сочетании с A.c = "DrawHints" приведет к частичной строке ()"Y**D***RR", и эта неполная строка также означает, что A.a должен быть установлен на «Заполнено» и так далее.

6
задан Mare Infinitus 26 June 2012 в 20:30
поделиться