gpt4 book ai didi

c# - 如何编写转换器类?如何高效编写映射规则?

转载 作者:太空狗 更新时间:2023-10-29 21:29:03 24 4
gpt4 key购买 nike

我有一个很大的 A 类,有很多成员,我有一个很大的 B 类可以在拥有 A 对象时构建。一个 A 对象可以在拥有时构建一个 B 对象。我需要他们两个,因为 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 映射并不是很难构建 A => B

的规则

所以问题是:

  • 是否有任何众所周知的模式可以实现这一目标?
  • 是否有默认的 C# 方式来执行此类操作?

写下这样简单的东西似乎不合适,它以数百行代码结束。

我考虑过为这些部分添加某种类型的转换器类,像 SomeStringConverter, SomeValueConverter, ...

  • 我如何将 A 的所需成员与 进行映射的规则。
  • 我如何编写这些规则以尽可能简单 做 A => B 和 B => A 的方式。

编辑:这里的模式是指“最佳实践”而不是“GoF 设计模式”

B类中的SomeString是某种“选择器”,它选择绘图选项,它总是 25 个字符长,A 类中的枚举选择那些字符,但在大多数情况下不是一对一。

举个例子:A.a = "Filled", 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 必须设置为“Filled”等等。

最佳答案

在我看来,A 更像是数据模型,而 B 更像是 View 模型。我认为这种情况没有普遍接受的“模式”——主要是因为这种配对背后的原因千差万别,而且最佳模式在很大程度上取决于预期用途。

也就是说,由于它们紧密联系在一起,我倾向于让一个类从属于另一个类。在这种情况下,由于 A 更直接,我可能会使用 A 作为 B 的数据容器。即,将私有(private)成员 A 作为类 B 中的字段,并且类 B 中的所有属性直接引用类 A——更新属性A 而不是在后面有自己的私有(private)领域。然后,您可以在类 B 上拥有一个公共(public)属性,如果需要,它可以公开类 A 的私有(private)成员。我可能会保持只读状态,但这可能并不重要(取决于您对 B 类的使用和任何可能的绑定(bind)关系)。另一方面,我会在 B 类上创建一个构造函数,它接受 A 类作为参数。 A 的传递值然后将分配给类 B 上的私有(private)类 A 成员。

所有这一切的结果是保持 A 类对 B 类的无知——如果您有 ViewModel 情况的真实用例,这将变得有用。如果您确定 A 类是您需要的更真实的 ViewModel,则反转上述操作,这样 B 类就是 A 类的无知者。

关于c# - 如何编写转换器类?如何高效编写映射规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com