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);
    }
}