2011-05-05 4 views
0

클래스가 있습니다. 나는 thios 클래스에 아무런 영향을 미치지 않는다. 다른 곳에서, 제 3 자로부터 오는 것이다.하위 클래스가있는 복사 클래스/개체

나는 내 자신의 수업을 가지고 있습니다. 업데이트 할 때도 마찬가지입니다. 하지만 나중에 개체가 누락 될 수 있습니다.

클래스를 복사해야하는데 여기에서 "소스"를 클래스 "대상"으로 호출 할 수 있습니다.

소스에는 구조체가 있고, int 및 문자열이있는 목록이 있습니다.

먼저 참조없이 물마루를 내려 봤는데, 그게 효과가있는 것처럼 보였지만, 누락 된 참조로 인해 대상이 비어있었습니다.

(코드가 누구인지 알고 싶다면 알려주세요).

는 지금은 이제 제 2의 시도를 : 그것은 올바른 방법 인 경우 나는 확실하지 않다, 내가 클래스 작품 단계별 목표에 적절한 장소,

에 값을 복사하는 데 문제가. 긴급 해결책이 필요하다면 도와주세요. 그리고 클래스 원본을 기존 대상에 복사하는 경우 (항목이 같은 구조체에있는 경우)

클래스 원본과 클래스 대상 자체에 영향을주지 않으므로 전혀 다른 제안을하지 마십시오. 값과 하위 클래스를 복사합니다.

내 코드는 여기까지입니다.

void refcopyObject(ref object source,ref object target,object svalue,object tvalue) 
{ 
if (source != null && target != null) 
{ 
if (source.GetType() == (typeof(string))) 
{ 
target = source; 
} 
else 
if (source.GetType() == (typeof(int))) 
{ 
target = source; 
} 
else 
if (source.GetType() == (typeof(IntPtr))) 
{ 
target = source; 
} 
else 
{ 
FieldInfo[] fifsource = source.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
FieldInfo[] fiftarget = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
if (fifsource.Length > 0) 
{ 
for (int i = 0; i < fifsource.Length; i++) 
{ 
if (fifsource.GetType() == fiftarget.GetType()) 
{ 
if (i < fiftarget.Length) 
{ 
object psource = source.GetType().GetFields(); 
object ptarget = target.GetType().GetFields(); 
object vsource = source.GetType().GetFields().GetValue(source); 
object vtarget = target.GetType().GetFields().GetValue(target); 
refcopyObject(ref psource, ref ptarget, vsource, vtarget); 
} 
} 
} 
} 
else 
{ 
//Unten angekommen 
copySubObject(ref source, ref target, svalue, tvalue); 
////So gehts nicht, dann wird die Referenz wieder verloren 
//FieldInfo[] fifs = svalue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
//if (fifs.Length > 0) 
//{ 
// FieldInfo[] fift = tvalue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
// for (int i = 0; i < fifs.Length; i++) 
// { 
// if (fifs.GetType() == fift.GetType()) 
// { 
// if (i < fift.Length) 
// { 
// object psource = svalue.GetType().GetFields().GetValue(svalue); 
// object ptarget = tvalue.GetType().GetFields().GetValue(tvalue); 
// if (ptarget == null) 
// { 
// //Ganz unten angekommen, Problem bei Listen 
// if (psource.GetType() == (typeof(string))) 
// { 
// tvalue.GetType().GetFields().SetValue(tvalue,psource); 
// } 
// if (psource.GetType() == (typeof(int))) 
// { 
// tvalue.GetType().GetFields().SetValue(tvalue, psource); 
// } 
// } 
// else 
// { 
// refcopyObject(ref psource, ref ptarget, null, null); 
// } 
// } 
// } 
// } 
//} 
} 
} 
} 
} 

내가 의견 시작 어디에 문제가 시작 추측 : 클래스와 서브 클래스 작동을 통해 협력 문제 (오른쪽 장소) 값을 설정 있습니다. 그 부분에 문자열이나 int를 포함하는 구조체 또는 목록을 가져 왔습니다.

고마워요!

빠른 회신

+0

당신은 그 모든'ref'를 필요로하지 않습니다. 약간의 공간이 필요합니다. –

+0

비슷한 질문 : [당신은 닷넷 (C# 구체적)에서 어떻게 개체를 깊은 복사합니까?] (http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy- an-object-in-net-c-specific) –

답변

1

음, 깊은 사본을 얻을 수있는 간단한 방법 직렬화 객체가 MemoryStream을로 직렬화하고 새 오브젝트로 직렬화하는 것입니다 :

public static T DeepCopy<T>(T other) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, other); 
     ms.Position = 0; 
     return (T)formatter.Deserialize(ms); 
    } 
} 

소스 유형을 [Serializable] 속성으로 표시해야하며 해당 코드에 액세스 할 수 없기 때문에이 코드는 사용자에게 의존하지 않으므로 사용자가 의존하지 않는다는 점에 유의하십시오.

[Serializable] 
public class MyClass 
{ 
    ... 
} 
(210)

비 직렬화 클래스

가 제대로 순환 참조를 처리하는 경우 테스트하는 것이 중요하지만 (CodeProject: Deep copy of objects in C#을 같은) 깊은 사본을 얻기 위해 반사를 사용하는 몇 가지 해결책이있다. 개체가 (직접 또는 간접적으로) 자신을 참조하지 않는 경우이 방법을 시도해 볼 수 있습니다.

+0

내가 말했듯이 내가 소스 클래스에 영향을 미치지 않는다. – user739611

+0

나는 실제로 기존 클래스 소스와 기존 클래스 타겟을 가지고있다. 소스에서 찾은 모든 것을 복사해야합니다.복제 등으로 작업하거나 클래스 중 하나를 변경할 수 없습니다 ... – user739611

+0

@ user739611 : [CodeProject article] (http://www.codeproject.com/KB/cs/Deep_copy_of_objects.aspx)에서 자세한 복사 방법을 시도해보십시오. . 개체 그래프에 순환 참조가 없으면 제대로 작동합니다. – Groo

관련 문제