C#Constructor重载:new object.FromOtherObject()?

时间:2016-05-26 07:56:00

标签: c# constructor initialization overloading initializer

我有两种不同类型的节点,我需要能够以相对简单的方式在它们之间进行转换。我正在考虑在构造函数中执行此操作,因为它会使代码更清晰。

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);

编辑; 或者是静态方法我已经完成了更多(传统上)正确的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:7)

你可以拥有一个NodeA参数的构造函数:

NodeB nodeB = new NodeB(nodeA);

...但是拥有工厂方法也是一种非常惯用的解决方案。它具有各种好处,包括能够使用不同名称但具有相同参数类型的多种方法 - 例如

TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)

允许该方法更灵活:

  • 在某些情况下可能会返回null(例如,对于空输入)
  • 它可以返回对现有对象的引用
  • 它可以返回子类的实例(例如Encoding.GetEncoding
  • 您可以将方法组转换为委托,这对LINQ操作很方便(不需要lambda表达式)

使它成为构造函数的一个好处是,如果你有一个NodeB的子类,那么它可以有一个构造函数接受NodeA并链接到{ {1}}构造函数。在没有代码重复的情况下使用工厂方法方法很难实现同样的目的。

根据Alessandro的评论,您可以拥有一个用户定义的转换运算符,无论是显式还是隐式。我会非常谨慎地使用隐式转换 - 当时他们可能觉得这是一个好主意,但最终会导致代码在以后不清楚。

最后,您还可以在NodeB(NodeA)上使用ToNodeB()方法 - 直接实施,或作为扩展方法。

所以为了解决这个问题,以下是“用户代码”外观的选项:

NodeA
相关问题