wpf2019. 3. 21. 17:44

List를 그대로 대입시켜버리면 해당 객체가 바뀌기때문에


clone, deep copy를 해야한다.


List<Book> books_2 = books_1.ConvertAll(book => new Book());



내가 봤을때는 이게 가장 나은 방법같다.

https://stackoverflow.com/questions/14007405/how-create-a-new-deep-copy-clone-of-a-listt

Posted by 동동(이재동)
wpf2017. 7. 24. 15:03

List<Object Class> 의 리스트를 duplicate 해서 새로운 리스트를 만들고 그안에 object property를 수정하고 싶었다.


하지만 list를 duplicate 했더라도 안에 프로퍼티를 바꾸면 오리지널 데이터까지 바뀌어졌다.
그래서 해당 obejct class 에 ICloneable interface를 사용하여서 해결하였다.

이렇게 object에 interface를 선언하고

1
2
3
4
5
6
7
8
9

public class OrderItem : ICloneable
    {     
        public int GroupCount { get; set; }
 
        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }

구현 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static List<OrderItem> GroupOrderItemByName(List<OrderItem> orderList)
        {
            var groupOrderItemList = new List<OrderItem>();
            var result = orderList.GroupBy(s => s.Name).ToList();
 
            foreach (var item in result)
            {
                var orderItem = (OrderItem)item.ToList()[0].Clone();
                orderItem.GroupCount = item.Count();
                groupOrderItemList.Add(orderItem);
            }
            
             return groupOrderItemList;
         }


참고 : https://stackoverflow.com/questions/6569486/creating-a-copy-of-an-object-in-c-sharp



Posted by 동동(이재동)
wpf2017. 7. 21. 15:13

내가 하고 싶었던거는


이렇게 BASE Model Class가 있고

1
2
3
4
5
public class OrderKey
    {
        public string nTempOrderID { get; set; }
        public string nOrderID { get; set; }
    }


OrderKey를 상속받는 클래스가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ConvertOrderKey : OrderKey
    {
        public List<OrderItem> OrderItemList { get; set; }
 
        public void CopyFromBase(OrderKey orderKey)
        {
            // copy base class properties.
            foreach (PropertyInfo prop in orderKey.GetType().GetProperties())
            {
                PropertyInfo prop2 = orderKey.GetType().GetProperty(prop.Name);
                prop2.SetValue(this, prop.GetValue(orderKey, null), null);
            }
        }
    }

ConvertOrderKey는 OrderKey를 상속받고 추가로 List를 하나 더 추가하는것이였다.


CopyFromBase라는 메소드를 만들어서 단순히 orderkey에 있는 내용을 전부 클래스에 복사한다.

이렇게 하면


1
2
3
4
5
6
7
8
9
10
11
 public static void ConvertData(ObservableCollection<OrderKey> orderKey)
        {   
            var covertOrderKeyList = new ObservableCollection<ConvertOrderKey>();
            foreach (var item in orderKey)
            {
                ConvertOrderKey cok = new ConvertOrderKey();
                cok.CopyFromBase(item);
                cok.OrderItemList = new List<OrderItem>();
                covertOrderKeyList.Add(cok);
            }
        }
 

이런식으로 기존 Base 클래스 List안에 있는것들에 있는것들을 상속받은 Class로 Copy하고

추가로 OrderITemList값을 지정할수 있다.


참고 : https://social.msdn.microsoft.com/Forums/vstudio/en-US/2105f08f-50ce-47a3-8e2a-3e62634d4cbc/copy-properties-from-base-class-to-derived-class-without-manually-mapping-them?forum=csharpgeneral

'wpf' 카테고리의 다른 글

List Object를 Copy 해보자. (ICloneable)  (0) 2017.07.24
non-ASCII를 없애보자.  (0) 2017.07.21
listbox에서 오른쪽 정렬하고 싶을때  (0) 2017.07.18
[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
Posted by 동동(이재동)