我有一个很大的 A 类,有很多成员,我有一个很大的 B 类,可以在拥有 A 对象时构建。拥有 B 对象时可以构建 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对象,通过颠倒构建A => B的规则来写普通的B => A映射并不难
所以问题是:
- 是否有任何众所周知的模式来实现这一目标?
- 有没有默认的 C# 方式来做这些事情?
写下类似这样的简单内容似乎不合适,它最终会变成数百行代码。
我考虑了一些用于部件的转换器类,例如 SomeStringConverter、SomeValueConverter、...
- 我如何将 A 的所需成员与规则一起抽象出来以进行映射。
- 我如何编写这些规则以最简单的方式来执行 A => B 和 B => A。
编辑: 这里的模式是指“最佳实践”而不是“GoF 设计模式”
B 类中的 SomeString 是某种“选择器”,它选择绘图选项,它总是 25 个字符长,A 类中的枚举选择这些字符,但在大多数情况下不是一对一的。
例如:Aa = "Filled", Ab = "SingleCoordinate", Ac = "DrawHints" 会产生类似 SomeString =
"Y**D***RR****---***---***"
即组合对于获得这样的字符串很重要,但是从组合中您可以派生必须在 A 对象中设置的枚举。
编辑2:
我对两种方式都使用我的映射规则的方式特别感兴趣,即 Aa = "Filled" 结合 Ab = "SingleCoordinate" 结合 Ac = "DrawHints" 将导致 (partial string) "Y**D***RR"
,并且部分字符串也意味着必须将 Aa 设置为“已填充”等等。