C# 构造函数重载:new object.FromOtherObject()?
C# Constructor overloads: new object.FromOtherObject()?
我有两种不同类型的节点,我需要能够以相对容易的方式在它们之间进行转换。我正在考虑在构造函数中执行此操作,因为它会使代码更清晰。
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);
编辑;
还是静态方法我已经完成了更多(传统上)正确的方法?
你可以有一个带有 NodeA
参数的构造函数:
NodeB nodeB = new NodeB(nodeA);
...但是拥有工厂方法也是一个非常惯用的解决方案。它有很多好处,包括能够有多个名称不同但参数类型相同的方法——例如
TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)
它也让方法更灵活:
- 在某些情况下它可能 return 为 null(例如对于 null 输入)
- 它可以return对现有对象的引用
- 它可以 return 一个子类的实例(例如
Encoding.GetEncoding
)
- 您可以将方法组转换为委托,这对于 LINQ 操作来说很方便(不需要 lambda 表达式)
使它成为构造函数的一个好处是,如果你有一个 NodeB
的子类,它可以有一个构造函数,它 也 采用 NodeA
并链接到 NodeB(NodeA)
构造函数。在没有代码重复的情况下使用工厂方法方法很难实现同样的事情。
根据 Alessandro 的评论,您可以有一个用户定义的转换运算符,可以是显式的也可以是隐式的。不过,我会 非常 谨慎对待隐式转换 - 它们在当时感觉是个好主意,但最终导致代码后来不清楚。
最后,您还可以在 NodeA
上使用 ToNodeB()
方法 - 可以直接实现,也可以作为扩展方法实现。
总而言之,以下是 "user code" 的外观选项:
NodeA nodeA = ...;
// One of...
NodeB nodeB = nodeA; // Implicit conversion
NodeB nodeB = (NodeB) nodeA; // Explicit conversion
NodeB nodeB = new NodeB(nodeA); // Constructor
NodeB nodeB = NodeB.FromNodeA(nodeA); // Factory method
NodeB nodeB = nodeA.ToNodeB(); // Instance or extension method on NodeA
我有两种不同类型的节点,我需要能够以相对容易的方式在它们之间进行转换。我正在考虑在构造函数中执行此操作,因为它会使代码更清晰。
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);
编辑; 还是静态方法我已经完成了更多(传统上)正确的方法?
你可以有一个带有 NodeA
参数的构造函数:
NodeB nodeB = new NodeB(nodeA);
...但是拥有工厂方法也是一个非常惯用的解决方案。它有很多好处,包括能够有多个名称不同但参数类型相同的方法——例如
TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)
它也让方法更灵活:
- 在某些情况下它可能 return 为 null(例如对于 null 输入)
- 它可以return对现有对象的引用
- 它可以 return 一个子类的实例(例如
Encoding.GetEncoding
) - 您可以将方法组转换为委托,这对于 LINQ 操作来说很方便(不需要 lambda 表达式)
使它成为构造函数的一个好处是,如果你有一个 NodeB
的子类,它可以有一个构造函数,它 也 采用 NodeA
并链接到 NodeB(NodeA)
构造函数。在没有代码重复的情况下使用工厂方法方法很难实现同样的事情。
根据 Alessandro 的评论,您可以有一个用户定义的转换运算符,可以是显式的也可以是隐式的。不过,我会 非常 谨慎对待隐式转换 - 它们在当时感觉是个好主意,但最终导致代码后来不清楚。
最后,您还可以在 NodeA
上使用 ToNodeB()
方法 - 可以直接实现,也可以作为扩展方法实现。
总而言之,以下是 "user code" 的外观选项:
NodeA nodeA = ...;
// One of...
NodeB nodeB = nodeA; // Implicit conversion
NodeB nodeB = (NodeB) nodeA; // Explicit conversion
NodeB nodeB = new NodeB(nodeA); // Constructor
NodeB nodeB = NodeB.FromNodeA(nodeA); // Factory method
NodeB nodeB = nodeA.ToNodeB(); // Instance or extension method on NodeA