加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:02:52 所属栏目:百科 来源:网络整理
导读:我有两种不同类型的节点,我需要能够以相对简单的方式在它们之间进行转换.我正在考虑在构造函数中执行此操作,因为它会使代码更清晰. NodeA nodea = new NodeA();NodeB nodeb = new NodeB.FromNodeA(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(...)

它还允许该方法更灵活:

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

使它成为构造函数的一个好处是,如果你有一个NodeB的子类,那么它可以有一个构造函数,它也将NodeA和链带到NodeB(NodeA)构造函数.在没有代码重复的情况下使用工厂方法方法很难实现相同的功能.

根据Alessandro的评论,您可以拥有一个用户定义的转换运算符,无论是显式还是隐式.我会对隐式转换非常小心 – 当时它们可能感觉像个好主意,但最终会导致代码在以后不清楚.

最后,你也可以在NodeA上使用ToNodeB()方法 – 直接实现,或者作为扩展方法.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读