2012-11-11 3 views
3

에서 파생 객체의 딥 카피 만드는 방법 :나는 다음과 같은 수업을 목록 <T>

public partial class AuthorizationSetObject 
{ 
    public AuthorizationObjectList AuthorizationObjects { get; set; } 
} 

public partial class AuthorizationObject 
{ 
    public string Text { get; set; } 
} 

public partial class AuthorizationObjectList : List<AuthorizationObject> 
{ 
} 

지금 AuthorizationSetObject의 깊은 사본이 필요합니다. 어떻게해야합니까?

나는 이런 식으로 시도 :

public static bool CopyProperties(object source, object target) 
{ 
    var customerType = target.GetType(); 
    foreach (var prop in source.GetType().GetProperties()) 
    { 
     var propGetter = prop.GetGetMethod(); 
     if (propGetter != null) 
     { 
      PropertyInfo pi = customerType.GetProperty(prop.Name); 
      if (pi != null) 
       { 
       var propSetter = pi.GetSetMethod(); 
       if (propSetter != null) 
       { 
        var valueToSet = propGetter.Invoke(source, null); 
        propSetter.Invoke(target, new[] { valueToSet }); 
       } 
      } 
     } 
    } 
    return true; 
} 

문제는의 AuthorizationObjectList 실제 딥 카피 아니라고. 딥 복사 후에 대상에서 "텍스트"속성을 변경하면 소스의 "텍스트"가 잘 변경됩니다.

아마도 "pi.PropertyType.BaseType.IsGenericType"과 같은 구현이 필요하고 다른 작업을 수행해야하지만 ...

아무도 아이디어가 있습니까?

대단히 감사합니다. 귀하의 질문에 게시

안부

이반

+4

http://stackoverflow.com/questions/13244161/how-to-keep-a-generic-list-unmodified-when-its-copy-is-modified/13244309#13244309 – Hardrada

+1

딥 복사본 값 의미를 제공하지 않는 언어에서는 객체를 직렬화 한 다음 다른 객체에서 직렬화 해제해야합니다. – Alex

+1

AuthorizationSetObject는 자체 클래스이므로 IClonable 인터페이스를 구현할 수 있습니다. –

답변

0

주석은 모든 올바른 방향을 가리키고있다. 문제는 라인에있는 것입니다

propSetter.Invoke(target, new[] { valueToSet }); 

valueToSet은 참조에 동일한 개체에 대한 참조를 추가한다는 것을 의미합니다. 이제 ICloneable이 등장합니다. 이 인스턴스의 새로운 깊은 복사본을 생성하는 대신

propSetter.Invoke(target, new[] { valueToSet.Clone() }); 

를 사용할 수 ICloneable valueToSet의 유형을 구현하는 경우.

+0

감사합니다. 당신의 대답에 대해 대단히. 정확히 어떻게 작동합니까? valueToSet은 object 유형이며 알려진 복제 메소드가 없습니다. ICloneable에 캐스트가 필요합니까? – Marc

+0

당신이 구현 한 더 전문적인 것을 사용할 수 있습니까? – sprinter252