문제

다음과 같은 것을 구현하는 "쉬운"방법이 있습니까? CopyTo() 에게 MemberwiseCopy (대신에 Clone() 또는 MemberwiseClone) C#에서? 나는 오래된 객체를 만들고 싶지 않기 때문에 오래된 객체를 잡고있는 모든 사람들이 완전히 다른 객체의 속성을 볼 수 있기를 원합니다. 이들 대부분은 추상 기능을 보유 할 수있는 부모 클래스에서 파생되지만 모든 멤버를 하나씩 복사하기 위해 수백 줄의 코드를 작성하고 싶지 않습니다. 모든 (나쁜 디자인이지만 내 것이 아니라 다시 작성되지도 않음)에 대해 복사해야 할 수도 있습니다. Microsoft가 이것에 대한 인터페이스를 만들었을 것 같거나 무언가를 크게 놓친 것 같습니다.

도움이 되었습니까?

해결책

직렬화/사제화가이를 수행하는 "가장 쉬운"방법이라고 생각합니다. 추가로, 고정 된 핸들을 사용하여 더 빠른 방법이 있습니다.

당신은 마샬 & gchandle을 사용할 수 있습니다 ( 이 링크 ):

public static object RawDeserializeEx( byte[] rawdatas, Type anytype ) 
{ 
 int rawsize = Marshal.SizeOf( anytype ); 
 if( rawsize > rawdatas.Length ) 
  return null; 
 GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned ); 
 IntPtr buffer = handle.AddrOfPinnedObject(); 
 object retobj = Marshal.PtrToStructure( buffer, anytype ); 
 handle.Free(); 
 return retobj; 
} 

public static byte[] RawSerializeEx( object anything ) 
{ 
 int rawsize = Marshal.SizeOf( anything ); 
 byte[] rawdatas = new byte[ rawsize ]; 
 GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned ); 
 IntPtr buffer = handle.AddrOfPinnedObject(); 
 Marshal.StructureToPtr( anything, buffer, false ); 
 handle.Free(); 
 return rawdatas; 
} 

다른 팁

나는 질문을받지 못한다. 기존 객체에 대한 참조를 만들고 싶은 것처럼 들립니다.

C#의 개체에 대한 변수 단지 객체에 대한 참조를 보유하므로 기존 객체에 변수를 할당 할 때 여전히 동일한 객체에 액세스하고 있습니다.

Object x = new Object();
Object y = x;
x.MyProperty = "hello";

위의 코드의 경우 y.myproperty == "hello"도.

참조 유형을 가진 모든 필드가 원래 참조 된 객체 인 Ad Infinitum의 멤버 위시 클론 ()으로 설정되는 딥 카피를 얻으려고합니까?

직렬화를 메모리 스트림으로 사용하고 인스턴스로 다시 사로화 할 수 있습니다.

우리는 프로젝트에 그러한 "심해"방법이 있습니다. 그것은 일종의 위험합니다. 우리는 카피 프로 테티-방법 또는 복사 생성자를 수업에 구현하기 시작했습니다.

다른 인스턴스의 값으로 객체의 모든 기존 필드를 덮어 쓰고 싶다면 쉬운 그것을하는 방법. 객체의 각 필드를 방문하고 값을 복사하기 위해 엉뚱한 반사 코드를 기꺼이 작성하려는 경우 수행 할 수 있습니다. 그러나 그것은 깨지기 쉽고 지저분 할 것입니다.

또한 올바르게하려면 객체의 상속 트리를 걷고 동일한 할당 작업을 수행해야합니다.

마지막으로 객체에 포함 된 경우 readonly 필드, 다른 인스턴스의 정확한 상태를 복사하는 것은 불가능할 수 있으며, 일관성없는 사본이 사본의 허용 가능한 결과인지 여부를 결정해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top