c# reflection copy-constructor derived-class

c# - Clase derivada y base, ¿puedo establecer la base explícitamente?



reflection copy-constructor (7)

En general muchos comentarios útiles. Creo que la respuesta corta fue dada por pst y creo que esto es correcto:

No. Razón breve: no hay un objeto base separado. (objeto) esta base == (objeto) siempre es verdadera. Sin embargo, hay formas de realizar la clonación / copia por reflexión (y otros medios). Tal vez describa lo que realmente se quiere

Por lo tanto, su sugerencia de usar la herramienta automapper también fue increíblemente útil y fue básicamente lo que estaba buscando.

public class SuperCar: Car { public bool SuperWheels { get {return true; } } } public class Car { public bool HasSteeringWheel { get {return true;} } }

¿Cómo puedo configurar la clase base para el Supercar derivado?

Por ejemplo, quiero simplemente establecer la clase base de SuperCars como esta:

public void SetCar( Car car ) { SuperCar scar = new SuperCar(); car.Base = car; }

Básicamente, si tengo objetos de Coche, no quiero recorrer manualmente cada propiedad del coche para configurar el objeto SuperCar, que creo que es la única forma en que puede hacerlo, pero si puede hacerlo de la otra manera sería tan mucho mejor.


En primer lugar, cada objeto SuperCar es diferente del otro. La herencia le ayuda a definir el comportamiento común de los objetos relacionados. No significa que sean los mismos objetos. Cada objeto de un tipo tiene su propio proceso de construcción. Antes de crear un objeto secundario, el objeto de la clase base se crea según la jerarquía de herencia. Si desea utilizar una propiedad común para todos los objetos de SuperCar, deberá mantener una instancia separada del objeto Car en la instancia de SuperCar, asignar el objeto de auto común en el objeto de auto en SuperCar y anular las propiedades derivadas de la base del automóvil. Objetar y redirigirlo a puntales. del objeto interno del coche.

public class SuperCar: Car { public bool SuperWheels { get {return true; } } Car carInstance = null; public void SetCar( Car car ) { carInstance = car; } }

Pero aún creo que hay algo mal con este diseño de la forma en que quieres hacerlo. Si puede informarnos el panorama general de por qué desea hacer esto, es posible que creamos un mejor diseño para satisfacer sus necesidades.


Esto no es posible.

Es necesario establecer manualmente las propiedades.


Si desea tener más control que copiar las propiedades reflejadas, intente aplicar el patrón de Builder. T puede ser cualquier clase derivada de BaseClass.

public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new() { return new T { Property1 = baseModel.Property1, Property2 = baseModel.Property2, }; }


Si entiendo su pregunta correctamente (y no estoy completamente seguro de que lo esté), entonces puede obtener el comportamiento que desea haciendo algo como esto:

class Car { public bool CarProperty { get; set; } // regular constructor public Car() { } // "copy" constructor public Car(Car c) { CarProperty = c.CarProperty; } } class SuperCar : Car { public bool SuperCarProperty { get; set; } // regular constructor public SuperCar() { } // "copy" constructor public SuperCar(Car c) : base(c) { SuperCar sc = c as SuperCar; if(sc != null) { SuperCarProperty = sc.SuperCarProperty; } }

Entonces puedes hacer esto:

public void SetCar(Car car) { SuperCar scar = new SuperCar(car); }

Tenga en cuenta que debe tener mucho cuidado en su constructor de "copia" para no copiar las propiedades de tal manera que dos objetos compartan los mismos miembros (referencias) cuando no deberían hacerlo.

Tengo que preguntar, sin embargo, ¿cuál es tu objetivo con esto?


Solo puede copiar el contenido de otra clase, pero no establecerlo directamente. Vea el ejemplo a continuación usando lo que se llama un constructor de copia.

class Car { string model; public Car(string model) { this.model = model; } protected Car(Car other) { this.model = other.model; } string Model { get; set; } } class SuperCar : Car { public SuperCar(Car car) : base(car) { } public SuperCar(string model) : base(model) { } bool IsTurbo { get; set; } }

La clave es la palabra clave base() después de la declaración del constructor.


Uso algo como esto en la subclase y funciona bien para mí:

using System.Reflection; . . . /// <summary> copy base class instance''s property values to this object. </summary> private void InitInhertedProperties (object baseClassInstance) { foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties()) { object value = propertyInfo.GetValue(baseClassInstance, null); if (null != value) propertyInfo.SetValue(this, value, null); } }