C# 用现有对象数据填充新对象

C# 用现有对象数据填充新对象,c#,oop,C#,Oop,我有一个服务,它在我的应用程序中返回一个名为“UserSettings”的自定义对象。我想向“UserSettings”对象添加更多属性,因此我创建了一个名为“MyUserSettings”的新对象,该对象继承自“UserSettings”,现在我想用“UserSettings”中保存的现有数据填充我的新对象以及我的新房产的新数据。我不希望必须将每个属性逐个映射到新对象中的相同属性,就像这样 _MyUserSettings.Name=_UserSettings.Name; 是否有一种方法或更好

我有一个服务,它在我的应用程序中返回一个名为“UserSettings”的自定义对象。我想向“UserSettings”对象添加更多属性,因此我创建了一个名为“MyUserSettings”的新对象,该对象继承自“UserSettings”,现在我想用“UserSettings”中保存的现有数据填充我的新对象以及我的新房产的新数据。我不希望必须将每个属性逐个映射到新对象中的相同属性,就像这样

_MyUserSettings.Name=_UserSettings.Name;

是否有一种方法或更好的方法可以一次性将现有对象的所有属性填充到新对象中???

是的,您可以使用复制构造函数模式。这将给您带来另一个好处——您不需要公共属性设置器,所以对象变得不可变

public MyUserSettings(UserSettings baseSettings)
{
    // TODO: set all properties
}

然而,不幸的是,这是改变具体机制的唯一途径。有多种方法(不一一列出):

  • 复制构造函数,它接受一个项并跨多个字段进行手动复制
  • 使用反射可以有一个更通用的机制来实现同样的效果
  • 使用类似于
他们都归结为做了几乎相同的事情

如果
UserSettings
实际上是一个
MyUserSettings
,则您可以简单地将其强制转换为:

var mySettings = (MyUserSettings)settings;

但是,如果
UserSettings
真的是
UserSettings

,则此操作将失败。另一个显而易见的选择是在MyUserSettings中保留对原始UserSettings的引用,然后在其中创建映射到原始对象的属性。然而,这可能是重复的代码,正如您所想的那样……正确的,在新对象中创建UserSettings属性可以做到这一点,但这是正确的方法吗?@NickLaMarca:好的,考虑到标准“我不想将每个属性逐个映射到新对象中的相同属性”我看不到任何其他简单的选项(Adam在下面谈到反射),但我个人会一个接一个地复制,尽管下面的答案中有说明,你把它放在构造函数中,而不是每次创建
MyUserSettings
对象时都写出代码。@Chris我首先尝试AutoMapper,这可能是一个完全没有代码的解决方案(它讨论了映射类型的猜测算法,在这个例子中,它应该能够轻松地猜测)。啊,我没想到他可能已经在构造函数中做了。我相信这里仍然需要一个接一个地映射每个属性,但你只需要至少做一次……做一次,保持简单。这绝对是最好的方法,尽管最初的帖子确实说没有逐个映射属性,所以根据OP的想法,它可能不符合标准。。。