我有两种不同类型的节点,我需要能够以相对简单的方式在它们之间进行转换。我正在考虑在构造函数中执行此操作,因为它会使代码更清晰。
NodeA nodea = new NodeA();
NodeB nodeb = new NodeB.FromNodeA(nodea);
我一直在谷歌搜索几个小时,但却找不到办法做到这一点。我提出的最佳解决方案是
public NodeB() { }
public static NodeB FromNodeA(NodeA theNodeA)
{
NodeB b = new NodeB();
b.Value = theNodeA.value;
// etc..
}
但是这会使代码看起来更加时髦;
NodeB b = NodeB.FromNodeA(nodea);
理想情况下,我希望能够做到这一点:
NodeB b = new NodeB().FromNodeA(nodea);
编辑; 或者是静态方法我已经完成了更多(传统上)正确的方法来实现这个目标吗?
答案 0 :(得分:7)
你可以拥有一个NodeA
参数的构造函数:
NodeB nodeB = new NodeB(nodeA);
...但是拥有工厂方法也是一种非常惯用的解决方案。它具有各种好处,包括能够使用不同名称但具有相同参数类型的多种方法 - 例如
TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)
还允许该方法更灵活:
Encoding.GetEncoding
)使它成为构造函数的一个好处是,如果你有一个NodeB
的子类,那么它可以有一个构造函数也接受NodeA
并链接到{ {1}}构造函数。在没有代码重复的情况下使用工厂方法方法很难实现同样的目的。
根据Alessandro的评论,您可以拥有一个用户定义的转换运算符,无论是显式还是隐式。我会非常谨慎地使用隐式转换 - 当时他们可能觉得这是一个好主意,但最终会导致代码在以后不清楚。
最后,您还可以在NodeB(NodeA)
上使用ToNodeB()
方法 - 直接实施,或作为扩展方法。
所以为了解决这个问题,以下是“用户代码”外观的选项:
NodeA