У меня есть довольно большой класс 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, инвертируя правила построения А => Б
Итак, вопросы:
Записывать что-то подобное кажется неуместным, это заканчивается сотнями строк кода.
Я думал о каких-то классах преобразователя для частей, как SomeStringConverter, SomeValueConverter,...
Изменить: Шаблон здесь подразумевается как «лучшие практики», а не как «шаблоны проектирования 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 должен быть установлен на «Заполнено» и так далее.