Parsear un objeto de la clase padre a una hija. C#. Aps.net MVC
Programación |
Asp.Net MVC |
c# |
POO |
Contexto:
Estoy en pleno desarrollo de una aplicación para una naviera. El proyecto lo estoy haciendo en asp.net MVC4.
Para facilitar el mantenimiento lo tengo dividido en capas. En una de ellas tengo los objetos comunes al proyecto DTO (Data Transfer Objects) que lo utilizo para transportar los datos entre las capas.
En el proyecto en MVC quería utilizar los DataAnnotations para la validación y para la nuestra de texto de los labels. Para la única cosa que se me ha ocurrido es hacer una clase derivada y crear los metadata asociados y trabajar con ella en la parte de la interfaz. Es decir:
[MetadataType(typeof(PersonaModelMetadata))]
public class PersonaModel: DTOTrasmapi.Persona
{
}
public class PersonaModelMetadata
{
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Shared.ErrorMessages))]
[Display(Name = "LblPersonaNombre_Name", Description = "LblPersonaNombre_Description", ResourceType = typeof(Resources.Models.Labels))]
public int Nombre { get; set; }
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Shared.ErrorMessages))]
[Display(Name = "LblPersonaApellido1_Name", Description = "LblPersonaApellido1_Description", ResourceType = typeof(Resources.Models.Labels))]
public string Apellido1 { get; set; }
[Display(Name = "LblPersonaApellido2_Name", Description = "LblPersonaApellido2_Description", ResourceType = typeof(Resources.Models.Labels))]
public string Apellido2 { get; set; }
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Shared.ErrorMessages))]
[Display(Name = "LblPersonaTelefono_Name", Description = "LblPersonaTelefono_Description", ResourceType = typeof(Resources.Models.Labels))]
public string Telefono { get; set; }
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Shared.ErrorMessages))]
[Display(Name = "LblPersonaEmail_Name", Description = "LblPersonaEmail_Description", ResourceType = typeof(Resources.Models.Labels))]
public string Email { get; set; }
}
El problema:
El problema ha venido a la hora de parsear un objeto padre a un objeto hijo. No lo he podido hacer directamente asi:
Trasmapi.Models.PersonaModel p = (Trasmapi.Models.PersonaModel)GetTaquilla().GetCompra().Comprador;
La solución:
Para solucionarlo he hecho lo siguiente: En la clase hija PersonaModel he creado dos constructores. El segundo es el interesante que es el que recorre todas las propiedades y asigna sus valores a la clase hija.
public PersonaModel()
{
}
public PersonaModel(DTOTrasmapi.Persona _persona)
{
foreach(var property in _persona.GetType().GetProperties())
{
var value = property.GetValue(_persona, null);
this.GetType().GetProperty(property.Name).SetValue(this, value, null);
//this.GetType().GetProperty(property.Name).SetValue(this, property.GetValue(_persona, null), null);
}
}