2017-06-22 13 views
1

は、私はこのクラスのインスタンスを持っている: 継承したクラスを基底クラスで初期化するには?

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

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

が、私はシリアル化されたJSONで複数のプロパティを必要とするいくつかのケースで

。私は最初の1のインスタンスに私の第二のクラスの新しいインスタンスを初期化することができますどのように、私は間違った方法で問題を解決していないよ場合

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

:私は、私はこのような第二継承されたクラスを作る必要があると思いましたすべての3つのプロパティを含むGetJson()のjson文字列を持っていますか?

+2

。 –

+0

可能な複製https://stackoverflow.com/questions/7987302/deserialize-classes-which-inherit-from-superclass-with-json-net – user3292642

+0

@ A.T。書き込みパスに私を導く:V – Blendester

答えて

2

あなたの派生クラスでコンストラクタを作成し、オブジェクトをマッピングすることができ、

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

更新コンストラクタ:

 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

これは私が欲しいものです。私の問題は、自動的にマッピングが行われることです。基本クラスのプロパティが変更された場合、継承クラスは古くなってしまいます。 – Blendester

+0

私は多くの努力を払うことを望んでいませんでしたが、すべてにコストがあります。ありがとう – Blendester

1

MyInheritedClassの子クラスのインスタンスを作成するだけで、両方のクラスのすべてのプロパティが保持されます。

子クラスMyInheritedClassのインスタンスを作成すると、実行時に親クラスMyInheritedClassのコンストラクタが呼び出され、親クラスのメンバのメモリが割り当てられ、子クラスのコンストラクタが呼び出されます。

Childクラスのインスタンスはすべてのプロパティを持ち、thisを参照していますが、オブジェクトをシリアル化してjsonですべてのプロパティをシリアル化する必要があります。

注:親クラスで宣言されているメソッドの中でオブジェクトをシリアル化していても、thisを参照すると、オブジェクトはすべてのプロパティを保持する子クラスのインスタンスである現在のインスタンスを参照します。

+0

ありがとう。私は親クラスのオブジェクトを手にしている、そこから子オブジェクトを作成する方法はありますか、新しいものを作成し、プロパティを1つずつ割り当てる必要がありますか?これは例外をスローする 'MyInheritedClass child =(MyClass)parent; – Blendester

+0

派生クラスオブジェクトに基本クラスオブジェクトを割り当てることはできません。 –

+0

新しい子オブジェクトを作成するときに、親から子の値を移動する方法は?私は手動で行う場合、親コードが変更され、より多くのプロパティを持っている場合、私の継承クラスは時代遅れになる恐れがあります。 – Blendester

1

いいえ、あなたは、基本クラスの派生インスタンスを初期化することができませんオブジェクト。あなたはseprate拡張メソッドを作成することができますしかし

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

用法:

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

出力は次のようになります。私はあなたの間違った方法についての権利だと思います

{"Email":"[email protected]","Username":"123","Password":"123"} 
関連する問題