C#添加到列表时如何删除对象之间的引用?
我有一个复杂的对象,它有很多属性,包括字符串、十进制和可观察的选择、列表 我想这样做:C#添加到列表时如何删除对象之间的引用?,c#,object,reference,C#,Object,Reference,我有一个复杂的对象,它有很多属性,包括字符串、十进制和可观察的选择、列表 我想这样做: foreach (ITransactionItem transactionItem in Transaction.TransactionItemCollection.ToList()) { transactionItem.PickUpQuantity = 0;
foreach (ITransactionItem transactionItem in Transaction.TransactionItemCollection.ToList())
{
transactionItem.PickUpQuantity = 0;
transactionItem.IsPickUp = false;
this.PickUpItemCollection.Add(transactionItem);
}
问题是,当我在PickUpItemCollection中更改项时,TransactionItemCollection中的引用项也会更改,我不想要它
我尝试使用此ExtensionMethod从对象复制对象:
public static T CopyFrom<T>(this T toObject, object fromObject)
{
var fromObjectType = fromObject.GetType();
foreach (PropertyInfo toProperty in toObject.GetType().GetProperties())
{
PropertyInfo fromProperty = fromObjectType.GetProperty(toProperty.Name);
if (fromProperty != null) // match found
{
// check types
var fromType = Nullable.GetUnderlyingType(fromProperty.PropertyType) ?? fromProperty.PropertyType;
var toType = Nullable.GetUnderlyingType(toProperty.PropertyType) ?? toProperty.PropertyType;
if (toType.IsAssignableFrom(fromType)&& toProperty.CanWrite)
{
toProperty.SetValue(toObject, fromProperty.GetValue(fromObject, null), null);
}
}
}
return toObject;
}
但问题仍然存在,我知道我可以将transactionItemModel的属性逐个设置为transactionItem的属性,但是有很多属性,它也有很多List/ObservableCollection。我想这会是个更好的主意,对吧
请帮帮我
谢谢在不了解对象的情况下,一般的答案是-您需要对对象进行深度复制。如果对象是复杂的,这并不像表面上看起来那么容易。
请参见在不了解对象的情况下,一般的答案是-您需要对对象进行深度复制。如果对象是复杂的,这并不像表面上看起来那么容易。
请参见在不了解对象的情况下,一般的答案是-您需要对对象进行深度复制。如果对象是复杂的,这并不像表面上看起来那么容易。
请参见在不了解对象的情况下,一般的答案是-您需要对对象进行深度复制。如果对象是复杂的,这并不像表面上看起来那么容易。
请参见,因为源和目标不一定是同一类型(
ITransactionItem
和TransactionItemModel
),并且目标对象是预先分配的,所以可以通过序列化为JSON(递归)将源到目标的所有公共属性和字段从源到目标,然后使用以下方法将它们填充到目标中:
公共静态类ObjectExtensions
{
公共静态void CopyFrom(此TTo目标,来自源),其中TTo:class
{
if(target==null)
抛出新ArgumentNullException();
//保留对象图结构并处理多态字段。
var settings=new JsonSerializerSettings{PreserveReferencesHandling=PreserveReferencesHandling.All,ReferenceLoopHandling=ReferenceLoopHandling.Serialize,TypeNameHandling=TypeNameHandling.Auto};
var json=JsonConvert.SerializeObject(源、设置);
PopulateObject(json、目标、设置);
}
}
大多数其他序列化程序不支持填充现有对象,这就是我建议使用此特定方法的原因。在这种情况下,使用
BinaryFormatter
进行深度复制是一个糟糕的选择,因为它将反序列化为与序列化类型完全相同的新实例。因为源和目标不一定是同一类型(ITransactionItem
和TransactionItemModel
)如果预先分配了目标对象,则可以(递归地)将源到目标的所有公共属性和字段序列化为JSON,然后使用以下方法将它们填充到目标中:
公共静态类ObjectExtensions
{
公共静态void CopyFrom(此TTo目标,来自源),其中TTo:class
{
if(target==null)
抛出新ArgumentNullException();
//保留对象图结构并处理多态字段。
var settings=new JsonSerializerSettings{PreserveReferencesHandling=PreserveReferencesHandling.All,ReferenceLoopHandling=ReferenceLoopHandling.Serialize,TypeNameHandling=TypeNameHandling.Auto};
var json=JsonConvert.SerializeObject(源、设置);
PopulateObject(json、目标、设置);
}
}
大多数其他序列化程序不支持填充现有对象,这就是我建议使用此特定方法的原因。在这种情况下,使用
BinaryFormatter
进行深度复制是一个糟糕的选择,因为它将反序列化为与序列化类型完全相同的新实例。因为源和目标不一定是同一类型(ITransactionItem
和TransactionItemModel
)如果预先分配了目标对象,则可以(递归地)将源到目标的所有公共属性和字段序列化为JSON,然后使用以下方法将它们填充到目标中:
公共静态类ObjectExtensions
{
公共静态void CopyFrom(此TTo目标,来自源),其中TTo:class
{
if(target==null)
抛出新ArgumentNullException();
//保留对象图结构并处理多态字段。
var settings=new JsonSerializerSettings{PreserveReferencesHandling=PreserveReferencesHandling.All,ReferenceLoopHandling=ReferenceLoopHandling.Serialize,TypeNameHandling=TypeNameHandling.Auto};
var json=JsonConvert.SerializeObject(源、设置);
PopulateObject(json、目标、设置);
}
}
大多数其他序列化程序不支持填充现有对象,这就是我建议使用此特定方法的原因。在这种情况下,使用
BinaryFormatter
进行深度复制是一个糟糕的选择,因为它将反序列化为与序列化类型完全相同的新实例。因为源和目标不一定是同一类型(ITransactionItem
和TransactionItemModel
)如果预先分配了目标对象,则可以(递归地)将源到目标的所有公共属性和字段序列化为JSON,然后使用以下方法将它们填充到目标中:
公共静态类ObjectExtensions
{
公共静态void CopyFrom(此TTo目标,来自源),其中TTo:class
{
if(target==null)
抛出新ArgumentNullException();
//保留对象图结构并处理多态字段。
var设置=新JsonSerializerSetting
foreach (ITransactionItem transactionItem in Transaction.TransactionItemCollection.AsEnumerable().ToList())
{
ITransactionItem transactionItemModel = new TransactionItemModel();
transactionItemModel.CopyFrom(transactionItem);
transactionItem.PickUpQuantity = 0;
transactionItem.IsPickUp = false;
this.PickUpItemCollection.Add(transactionItemModel);
}
public static class ObjectExtensions
{
public static void CopyFrom<TTo, TFrom>(this TTo target, TFrom source) where TTo : class
{
if (target == null)
throw new ArgumentNullException();
// Preserve object graph structure and handle polymorphic fields.
var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, ReferenceLoopHandling = ReferenceLoopHandling.Serialize, TypeNameHandling = TypeNameHandling.Auto };
var json = JsonConvert.SerializeObject(source, settings);
JsonConvert.PopulateObject(json, target, settings);
}
}