¿Cuál sería la mejor manera de escribir una función de constructor de copia genérica para mis clases de C#? Todos heredan de una clase base abstracta, así que podría usar la reflexión para mapear las propiedades, pero me pregunto si hay una forma mejor.Genérico C# Copy Constructor
Respuesta
Puede crear una copia poco profunda eficientemente con reflexión mediante precompilación, por ejemplo con Expression
. Por ejemplo, like so.
Para copias en profundidad, la serialización es el enfoque más confiable.
Evita la reflexión si puedes. Cada clase debe tener la responsabilidad de copiar sus propias propiedades y enviarlas al método base.
tan sólo para aclarar, que sería mejor si tuviera un constructor de copia personalizada en cada clase que asigna explícitamente las propiedades? – lomaxx
Lo haría. ¿Qué tan difícil es escribir? Ciertamente más fácil de leer a simple vista que un método basado en la reflexión. – duffymo
Sí, recomendaría ese enfoque. –
Un constructor de copia básicamente significa que tiene un único parámetro, que es el objeto que va a copiar.
Además, haga una copia profunda, no una copia poco profunda.
Si usted no sabe lo que las copias son profundos y poco profundos, entonces éste es el trato:
Supongamos que está copiando una clase que tiene una sola fila de números enteros como campo.
Una copia superficial sería:
public class Myclass()
{
private int[] row;
public MyClass(MyClass class)
{
this.row = class.row
}
}
copia profunda es:
public class Myclass()
{
private int[] row;
public MyClass(MyClass class)
{
for(int i = 0; i<class.row.Length;i++)
{
this.row[i] = class.row[i];
}
}
}
una copia profunda realmente obtiene los valores actuallos y los pone en un nuevo campo del nuevo objeto, mientras que una la copia superficial solo copia los punteros.
Con la copia superficial, si se establece:
row[3] = 5;
y luego imprimir ambas filas, ambos grabados tendrán 5 como valor del cuarto número. Sin embargo, con una copia profunda, solo la primera impresión tendrá esto, ya que las filas no tienen los mismos punteros.
Puede usar 'row.clone()' ya que C# permite clonar matrices primitivas. –
¿No falla el código anterior debido a que 'row' nunca se inicializó? – AnotherParker
Aquí hay un constructor que estoy usando. Tenga en cuenta que este es un constructor superficial, y bastante simplista, debido a la naturaleza de mi clase base. Debería ser lo suficientemente bueno para comenzar.
public partial class LocationView : Location
{
public LocationView() {}
// base class copy constructor
public LocationView(Location value) {
Type t = typeof(Location);
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo pi in properties)
{
pi.SetValue(this, pi.GetValue(value, null), null);
}
}
public Quote Quote { get; set; }
}
One line-able: 'foreach (var propertyInfo en typeof (LocationView) .BaseType.GetProperties()) propertyInfo.SetValue (this, propertyInfo.GetValue (obj_to_copy_parameter, null), null);' también puede usar un inicializador de campo para solo leyó GetProperties una vez. –
@ChrisMarisic Tiendo a evitar frases sueltas cuando sacrifica capacidad de lectura. – B2K
Ver también http://stackoverflow.com/questions/14218989/best-way-to-clone-properties-of-disparate-objects Obtuve una extensión genérica para propiedades comunes de clonación superficial – B2K
Es posible hacer referencia a paquetes valueinjecter y NuGet fasterflect y uso:
public class Myclass()
{
private string _property;
public MyClass(MyClass obj)
{
this.InjectFrom(obj.DeepClone());
}
}
- 1. C# Generic Copy Constructor
- 2. Constructor C# Struct Genérico
- 3. C# Genérico estático Constructor
- 4. Copy Constructor y constructor predeterminado
- 5. Explaining copy constructor example
- 6. template copy constructor
- 7. Copy Constructor Necesario con el objeto temporal
- 8. Tipo genérico en el constructor
- 9. ¿Hay un constructor genérico con restricción de parámetro en C#?
- 10. C# Shallow copy Dictionary?
- 11. C++ Qt Reflection with Copy and Assignment
- 12. llamar al constructor de un tipo genérico
- 13. C# Thread Safe Deep Copy
- 14. C++, cómo copiar correctamente std :: vector <Class *> en copy constructor?
- 15. ¿Por qué C# no es compatible con el concepto de Copy Constructor?
- 16. C++ constructor espeluznante
- 17. C++ Copiar Constructor + Objeto Puntero
- 18. Envase genérico en C++
- 19. C# genérico con constante
- 20. Genérico propiedad en C#
- 21. C# Resumen Método genérico
- 22. matriz genérica de niño genérico C#
- 23. C++: Problemas de constructor
- 24. Especificación de la restricción del constructor para el parámetro genérico
- 25. ¿Es compatible el constructor genérico en clase no genérica?
- 26. Construir un objeto genérico (no el constructor predeterminado)
- 27. ¿Qué es un caso de uso para un constructor genérico?
- 28. Definir constructor predeterminado Structuremap en un repositorio genérico
- 29. Mapa genérico de identidad en C#. No quiero el constructor público
- 30. C# genéricos problema - revivir el tipo genérico con parámetros en el constructor
+1 para las ideas claras en su ejemplo vinculado. – Ergwun