c#将对象克隆到新变量

c#将对象克隆到新变量,c#,C#,我有一个从数据库填充的类: // original data var dbData = this.GetOriginalData(ID); 然后,我想为同一对象创建一个新实例,在该实例中,我可以修改属性,但保持原来的属性不变 如果我这样做: var newData = dbData; newData.Text = "Sample"; 然后dbData.Text也被修改 如何在不创建新类和逐个属性传递属性或不使用AutoMapper(例如)的情况下创建dbData的实例 您可以使用Json序

我有一个从数据库填充的类:

 // original data
var dbData = this.GetOriginalData(ID);
然后,我想为同一对象创建一个新实例,在该实例中,我可以修改属性,但保持原来的属性不变

如果我这样做:

var newData = dbData;
newData.Text = "Sample";
然后dbData.Text也被修改

如何在不创建新类和逐个属性传递属性或不使用AutoMapper(例如)的情况下创建dbData的实例


您可以使用Json序列化程序通过创建新对象并使用serialize/deserialize复制所有属性来克隆对象

public static T CloneJson<T>(this T source)
{            
    // Don't serialize a null object, simply return the default for that object
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    // initialize inner objects individually
    // for example in default constructor some list property initialized with some values,
    // but in 'source' these items are cleaned -
    // without ObjectCreationHandling.Replace default constructor values will be added to result
    var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};

    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}
publicstatict CloneJson(此T源代码)
{            
//不要序列化空对象,只需返回该对象的默认值
if(Object.ReferenceEquals(source,null))
{
返回默认值(T);
}
//单独初始化内部对象
//例如,在默认构造函数中,某些列表属性使用某些值初始化,
//但在“源”中,这些项目已清理-
//没有ObjectCreationHandling。替换默认构造函数值将添加到结果中
var deserializeSettings=new JsonSerializerSettings{ObjectCreationHandling=ObjectCreationHandling.Replace};
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(源),反序列化设置);
}

可能与Thank Jon的可能副本有关。您如何调用该函数?var newData=CloneJson(dbData);其中MyDataType是DBDataType的类名,您还需要从Nuget软件包管理器安装Newtonsoft.Json(右键单击项目,管理Nuget软件包,搜索Newtonsoft Json)