【问题标题】:How to create object by assigning other object with similar fields如何通过分配具有相似字段的其他对象来创建对象
【发布时间】:2019-12-09 14:51:58
【问题描述】:

我有一个带有一些值的 FullClass。我想复制其中的一些值并将其作为副本保存,因此我创建了对应的 CopyClass。我如何重写此代码以在没有 new 关键字的情况下实现对象创建,并且只需像示例中那样分配值 - 以便更简单地使用。

class FullClass
{
    public int x;
    public int y;
    public int z;
}

class CopyClass
{
    public int x;
    public int y;

    public CopyClass(FullClass fullObject)
    {
        x = fullObject.x;
        y = fullObject.y;
    }
}

void AssignCopyObject()
{
    //I want small copy of FullClass with some of it's values
    CopyClass copyObject;

    //How I create small class object
    copyObject = new CopyClass(fullObject);

    //How I want to create it automaticly by using assign of full class object
    copyObject = fullObject; //ofc doesn't work
}

【问题讨论】:

  • 听起来你在找Automapper
  • 我不明白这个问题。复制构造函数有什么问题?
  • @amy 没什么,它有效 :D 我只是想知道你是否可以像我提到的那样写它。
  • 这个问题有不同的答案,取决于你的实际用例和你想做什么;使用复制构造函数很清楚,并且表明它不是对同一对象的引用(您可以使用隐式转换将其隐藏);使用继承会混淆可变性,您应该继承行为而不是结构。
  • @Bizio 你可以,但是下一个阅读代码的人可能不会意识到它是副本而不是参考。

标签: c#


【解决方案1】:

您可以使用implicit conversion operator 来做到这一点:

class CopyClass
{
    public int x;
    public int y;

    public CopyClass(FullClass fullObject)
    {
        x = fullObject.x;
        y = fullObject.y;
    }

    public static implicit operator CopyClass(FullClass fc) => new CopyClass(fc);
}

但这有点混淆了你的意图。

我个人会选择new CopyClass(fullObject);,因为这表明您正在创建不同类型的副本。

【讨论】:

  • OP 询问“无需新关键字即可创建对象”,您的回答实际上只是将新关键字转移到另一个地方。
  • @MongZhu 我认为你对这个问题的解释太过字面了。 OP 想写copyObject = fullObject;,这将允许他们这样做。
  • 您可能是对的 :) 显然 Bizio 对您的解决方案很满意。我倾向于在 SO 上学究气。投赞成票:)
猜你喜欢
  • 2020-06-26
  • 2022-11-10
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
相关资源
最近更新 更多