objetos - ¿Puedo clonar profundamente el objeto ac#sin etiquetar ICloneable o Serializable?
copiar un objeto en c# (3)
Tengo un objeto no escrito por mí mismo que necesito clonar en la memoria. El objeto no está etiquetado ICloneable o Serializable, por lo que la clonación profunda a través de la interfaz o la serialización no funcionará. ¿Hay alguna forma de clonar profundamente este objeto? ¿Una llamada a API win32 no segura tal vez?
Creo que la única forma en que puedes hacer esto es reflexionar seriamente para separar el objeto y todos sus miembros (que pueden ser otros objetos con miembros, etc.). Eso es lo que el serializador de marcos estaría haciendo, pero solo lo hará por cosas que han sido marcadas apropiadamente.
No estoy seguro de si una biblioteca de reflexión de grado industrial como Mono.Cecil puede tener algunas cosas que ayuden.
Dudo que haya encontrado una solución robusta de propósito general (por ejemplo, los miembros estáticos pueden ser difíciles de manejar de forma adecuada), pero podría hacer que algo funcione en un caso específico.
El "profundo" es el truco. Para una copia superficial, podría usar el reflejo para copiar los campos (suponiendo que ninguno sea de solo lectura, lo cual es una gran suposición), pero sería muy difícil hacer que esto funcione (automáticamente) de lo contrario.
La otra opción es proporcionar usted mismo el serializador (y serializarlo para clonar profundamente), un "sustituto de serialización". Aquí hay un ejemplo de VB.
Las interfaces FYI marcadas como IClonables no se copian de manera importante. Depende del implementador implementar ICloneable y no hay garantía de que lo hayan clonado. Usted dice que el objeto no implementa ISerializable, pero ¿tiene el atributo Serializable?
Crear una copia profunda a través de serialización binaria es probablemente uno de los métodos más sencillos que conozco, ya que puedes clonar cualquier gráfico complejo en 3-5 líneas de código. Otra opción sería el XmlSerializer si el objeto puede ser XmlSerialized (no especifica ningún atributo para la serialización ni implementa interfaces, pero si hay una interfaz IDictionary con su manguera).
Fuera de eso, no puedo pensar en nada. Si todos los datos son públicamente accesibles, podría hacer su propia rutina de clonación. Si no es así, aún puede clonarlo utilizando el reflejo para establecer los datos privados.