Pergunta

Há uma maneira "fácil" para implementar algo como CopyTo() para MemberwiseCopy (em vez de Clone() ou MemberwiseClone) em C#?Eu não quero criar um novo objeto, como eu quero que todos segurando o antigo para ser capaz de ver os atributos de um novo, que pode ser completamente diferente.Enquanto a maioria destes derivam de uma classe pai que poderia realizar algum resumo de função, eu não quero escrever algumas centenas de linhas de código para copiar todos os membros, um por um.O que talvez precise ser copiados através de todos (design ruim, mas não é minha, nem é ser reescrito).Parece que a Microsoft teria criado uma interface para isso ou eu muito a sua falta alguma coisa?

Foi útil?

Solução

Eu acho que a serialização/deserialização é a maneira "mais fácil" de fazer isso. Além disso, há uma maneira mais rápida de fazê -lo, usando alinhes presos.

Você poderia usar o marechal e gchandle assim (de esse link ):

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; 
} 

Outras dicas

Eu não entendo a pergunta.Soa como se você apenas deseja criar uma referência a um objeto existente.

Variáveis a objetos em C# apenas conter uma referência para o objeto, de modo que quando você atribui uma variável de um objeto existente, você ainda estiver acessando o mesmo objeto.

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

Para o código acima, y.MyProperty=="olá" bem.

Você está tentando obter uma cópia profunda, isto é, onde cada um campo com um tipo de referência também é definida como uma MemberwiseClone() de originalmente objeto referenciado, ad infinitum?

Você pode usar a serialização em um fluxo de memória e a desserialização de volta a uma instância.

Temos um método "Deepcopy" em nosso projeto. É meio arriscado. Começamos a implementar métodos de cópia-propriedade ou copiadores em nossas classes, porque é mais confiável e oferece mais controle no final.

Se você deseja substituir todos os campos existentes de um objeto com os valores de outra instância, não há fácil maneira de fazer isso. Isso pode ser feito se você estiver disposto a escrever algum código de reflexão maluco para visitar cada campo do objeto e copiar os valores. Mas seria frágil e bagunçado.

Além disso, para fazê -lo corretamente, você precisaria percorrer a árvore de herança do objeto e executar as mesmas operações de atribuição também.

Finalmente, se o objeto contiver readonly Campo, pode ser impossível copiar o estado exato de outra instância e você será forçado a decidir se cópias inconsistentes são um resultado aceitável da cópia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top