-1

我有一个需要克隆的 originalDailyDetailReport 列表。其中的数据会在申请期间更改,但是当我打印最终报告时,我确实需要原始数据。

我虽然这段代码应该可以解决问题,但最后,我仅用于打印报告的 duplicateDailyDetailReport 列表已更改。

有任何想法吗?

    public DailyDetailReports SaveOriginalDailyDetailReportData(DailyDetailReports originalDailyDetailReport )
            {
                DailyDetailReports duplicateDailyDetailReport = new DailyDetailReports();

                try
                {
                    duplicateDailyDetailReport.Rec.AddRange(
originalDailyDetailReport.Rec.ConvertAll<Receivables>(rec => rec));

    duplicateDailyDetailReport.Dil.AddRange(
originalDailyDetailReport.Dil.ConvertAll<Dilution>(dil=> dil));

    duplicateDailyDetailReport.Acc.AddRange(
originalDailyDetailReport.Acc.ConvertAll<Accountable>(acc => acc));
                                duplicateDailyDetailReport.Out.AddRange(
originalDailyDetailReport.Out.ConvertAll<Outstanding>(o => o));
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }

                                return duplicateDailyDetailReport ;
                            }
4

4 回答 4

1

您可以尝试以下操作,克隆每个项目并创建一个新列表。

var newList = yourlist.Select(r => r.Clone()).ToList();
于 2012-09-27T12:37:42.370 回答
0

您需要遍历原始列表,制作每个元素的副本(其实例的副本,而不仅仅是引用的副本),然后将该副本添加到新列表中。

于 2012-09-27T12:39:12.777 回答
0

列表由对单个对象而非实际对象的引用组成。复制列表时,会创建一个新列表,该列表引用与旧列表相同的对象。您必须逐个字段深度复制对象并将其推送到列表中。

于 2012-09-27T13:12:30.370 回答
0

我自己做的。我用反射。

这是代码。无论好坏,它都有效。

public static DailyDetailReports CloneLists(DailyDetailReports listToClone)
        {
            DailyDetailReports clonedList = new DailyDetailReports();

            clonedList.Rec.AddRange(PerformTheCloning(listToClone.Rec));
            clonedList.Dil.AddRange(PerformTheCloning(listToClone.Dil));
            clonedList.Acc.AddRange(PerformTheCloning(listToClone.Acc));
            clonedList.Out.AddRange(PerformTheCloning(listToClone.Out));

            return clonedList;
        }

    public static List<T> ListCloning<T>(List<T> listToClone)
            {
                PropertyInfo[] listToCloneProperties = listToClone.GetType().GetGenericArguments().First().GetProperties();

                try
                {
                    List<T> clonedList = new List<T>();

                    foreach (object t in (IEnumerable<object>)listToClone)
                    {
                        object clonedListRecord = Activator.CreateInstance(typeof(T), null);

                        foreach (PropertyInfo t1 in listToCloneProperties)
                        {
                            PropertyInfo clonedListProperty =
                                clonedListRecord.GetType().GetProperties().FirstOrDefault(record=> record.Name == t1.Name);

                            if (clonedListProperty != null)
                                clonedListProperty.SetValue(clonedListRecord, t1.GetValue(t, null), null);
                        }

                        clonedList.Add((T)clonedListRecord);
                    }

                    return clonedList;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                return null;
            }
于 2012-09-28T16:21:54.923 回答