Tengo una instancia de esta clase:

public class MyClass
{
    public string Username { get; set; }
    public string Password { get; set; }

    public string GetJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

Pero en algunos casos necesito más propiedades en json serializado. Pensé que debería hacer una segunda clase heredada como esta:

public class MyInheritedClass : MyClass
{
    public string Email { get; set; }
}

Si no estoy resolviendo el problema de manera incorrecta, ¿cómo puedo inicializar una nueva instancia de mi segunda clase con una instancia de la primera y tener una cadena json de GetJson() que contiene las tres propiedades?

4
Blendester 22 jun. 2017 a las 09:23

3 respuestas

La mejor respuesta

Puede crear un constructor en su clase derivada y asignar los objetos,

public class MyInheritedClass : MyClass
{
    MyInheritedClass (MyClass baseObject)
    {
        this.UserName = baseObject.UserName; // Do it similarly for rest of the properties
    }
    public string Email { get; set; }
}

MyInheritedClass inheritedClassObject = new MyInheritedClass(myClassObject);
inheritedClassObject.GetJson();

Constructora actualizada:

        MyInheritedClass (MyClass baseObject)
         {      
           //Get the list of properties available in base class
            var properties = baseObject.GetProperties();

            properties.ToList().ForEach(property =>
            {
              //Check whether that property is present in derived class
                var isPresent = this.GetType().GetProperty(property);
                if (isPresent != null && property.CanWrite)
                {
                    //If present get the value and map it
                    var value = baseObject.GetType().GetProperty(property).GetValue(baseObject, null);
                    this.GetType().GetProperty(property).SetValue(this, value, null);
                }
            });
         }
8
JSWilson 17 oct. 2019 a las 01:43

Solo necesita crear una instancia de clase secundaria que sea MyInheritedClass y contendrá todas las propiedades de ambas clases.

Cuando crea una instancia de la clase secundaria MyInheritedClass, el tiempo de ejecución llamará al constructor de la clase primaria MyInheritedClass primero para asignar la memoria para el miembro de la clase primaria y luego se invocará el constructor de la clase secundaria.

Por lo tanto, la instancia de la clase Child tendrá todas las propiedades y se está refiriendo a this al serializar el objeto, por lo que debería tener todas las propiedades serializadas en json.

Nota: Aunque está serializando el objeto dentro del método que se declara en la clase principal, al hacer referencia al objeto this se hará referencia a la instancia actual que es la instancia de la clase Child, por lo que contendrá todas las propiedades.

2
Jenish Rabadiya 22 jun. 2017 a las 06:27

No. no puede inicializar la instancia derivada en el objeto de clase base.

Sin embargo, puede crear un método de extensión separado,

    public class MyClass
    {
        public string Username { get; set; }
        public string Password { get; set; }

        public string GetJson()
        {
            return JsonConvert.SerializeObject(this);
        }
    }

    public class MyInheritedClass : MyClass
    {
        public string Email { get; set; }
    }

    public static class MyClassExtension
    {
        public static MyInheritedClass ToMyInheritedClass(this MyClass obj, string email)
        {
            // You could use some mapper for identical properties. . . 
            return new MyInheritedClass()
            {
                Email = email,
                Password = obj.Password,
                Username = obj.Password
            };
        }
    }

Uso:

 MyClass myClass = new MyClass { Username = "abc", Password = "123" };
 var myInheritedClass = myClass.ToMyInheritedClass("abc@mail.com");
 Console.WriteLine(myInheritedClass.GetJson());

La salida sería:

{"Email":"abc@mail.com","Username":"123","Password":"123"}
1
A.T. 22 jun. 2017 a las 06:41