2017-06-22 1 views
1

Ich habe eine Instanz dieser Klasse:Wie initialisiert man geerbte Klasse mit der Basisklasse?

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

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

aber in einigen Fällen, die ich mehr Eigenschaften in serialisierten json benötigen. Ich dachte, ich soll eine zweite vererbte Klasse wie folgt machen:

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

Wenn ich das Problem nicht in der falschen Art und Weise zu lösen, wie kann ich eine neue Instanz meiner zweiten Klasse mit einer Instanz des ersten initialisieren und haben Sie eine JSON-Zeichenfolge von GetJson(), die alle drei Eigenschaften enthält?

+2

Ich glaube, Sie über Ihren falschen Weg richtig sind. –

+0

möglich duplicate von https://stackoverflow.com/questions/7987302/deserialize-classes-which-inherit-from-superclass-with-json-net – user3292642

+0

@ A.T. Führe mich zum Schreibpfad: V – Blendester

Antwort

2

Sie können einen Konstruktor in der abgeleiteten Klasse erstellen und die Objekte abzubilden,

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(); 

Aktualisiert Constructor:

 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) 
       { 
        //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); 
       } 
      }); 
     } 
+0

Eigentlich ist das was ich will. nur mein Problem ist, dass ich wünsche, Mapping automatisch auftreten, also wenn Eigenschaften der Basisklasse ändern, meine geerbte Klasse nicht veraltet. – Blendester

+0

Ich hoffte es braucht nicht so viel Aufwand, aber alles hat seinen Preis .. Danke – Blendester

1

Sie müssen nur eine Instanz der untergeordneten Klasse erstellen, die MyInheritedClass ist und alle Eigenschaften aus beiden Klassen enthält.

Wenn Sie eine Instanz der untergeordneten Klasse MyInheritedClass erstellen, ruft runtime den Konstruktor der übergeordneten Klasse MyInheritedClass zuerst auf, um den Speicher für das Mitglied der übergeordneten Klasse zuzuweisen. Anschließend wird der untergeordnete Klassenkonstruktor aufgerufen.

So Instanz der Child-Klasse wird alle Eigenschaften haben und Sie beziehen sich auf die this während der Serialisierung des Objekts, so dass es alle Eigenschaften in JSON serialisiert haben sollte.

Hinweis: Obwohl Sie das Objekt innerhalb der in der übergeordneten Klasse deklarierten Methode serialisieren, verweist das Objekt this auf die aktuelle Instanz, die die Instanz der Child-Klasse ist, und enthält daher alle Eigenschaften.

+0

Danke. Ich habe ein Objekt der Elternklasse in der Hand, gibt es eine Möglichkeit, daraus ein Kindobjekt zu erstellen oder ich möchte ein neues Objekt erstellen und Eigenschaften einzeln zuweisen? dies löst eine Ausnahme aus: 'MyInheritedClass child = (MyClass) übergeordnet;' – Blendester

+0

Sie können das Basisklassenobjekt dem abgeleiteten Klassenobjekt nicht zuweisen. –

+0

So, wie Werte von Eltern zu Kind verschoben werden, wenn ein neues untergeordnetes Objekt erstellt wird?Ich fürchte, wenn ich es manuell mache, wenn der Elterncode geändert wird und mehr Eigenschaften hat, wird meine vererbte Klasse veraltet. – Blendester

1

Nein, Sie können nicht die abgeleitete Instanz in Basisklasse initialisieren Objekt.

immer Sie seprate Erweiterungsmethode erstellen,

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 
      }; 
     } 
    } 

Nutzung:

MyClass myClass = new MyClass { Username = "abc", Password = "123" }; 
var myInheritedClass = myClass.ToMyInheritedClass("[email protected]"); 
Console.WriteLine(myInheritedClass.GetJson()); 

Ausgabe wäre:

{"Email":"[email protected]","Username":"123","Password":"123"} 
Verwandte Themen