【问题标题】:ToArray() Method Clones All Instances as Last OneToArray() 方法将所有实例克隆为最后一个
【发布时间】:2016-04-05 17:00:25
【问题描述】:

我有一个数组并输入类似;

List<ContractListType> ContractsList = new List<ContractListType>();
ContractListType instance = new ContractListType(); 

我将 4 个元素添加到我的 ContractsList 4 by

If a == 1
    instance.name = "A"
    ContractsList.Add(instance);
If b == 1
    instance.name = "B"
    ContractsList.Add(instance);
If c == 1
    instance.name = "C"
    ContractsList.Add(instance);
If d == 1
    instance.name = "D"
    ContractsList.Add(instance);

最后我想将我的列表与响应相匹配。

response.GetContractListResponse.GetContractListResponseDTO.ContractListType = ContractsList.ToArray();

虽然a=1,b=2,c=3,d=4;我的回应就像

<name>D</name>
<name>D</name>
<name>D</name>
<name>D</name>

当我调试时,在响应之前我可以看到 conractsList 中的所有名称,但是当 ToArray 运行时,所有名称都转换为“D”,这是最后一个。

我找不到解决方案。请帮帮我。

【问题讨论】:

    标签: c# .net arrays list add


    【解决方案1】:

    使用 .NET/C#,您不会将对象本身添加到列表中,而是将对象的引用添加到列表中。您的代码添加了 4 次相同的引用并修改了引用。您需要先克隆对象并更改其属性,然后再将其添加到列表中以实现您想要的结果。

    试试这个模式。

    If a == 1
        ContractsList.Add(new ContractListType{ name = "A" } );
    

    MSDN 提供了一个很好的 implementing a Deep copy of your object 示例。

    【讨论】:

    • 我看到你了,但不知道如何克隆对象并在添加到列表之前更改其属性。可以举个例子吗?
    • 创建一个新的构造函数,它接受相同类型的参数并复制属性。请注意,作为引用类型(类)的属性也需要它们自己的克隆。
    • @Gyepesto 在 .NET 中没有可靠地克隆对象的通用方法。通常你必须在对象中提供一个自定义的 .Clone() 方法,或者像 Babak 展示的那样在你需要的时候手动重建它(.Clone() 方法通常只包含你为“手动”方法所做的代码并返回结果 new 对象。)。
    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多