2017-06-22 107 views
1

我有這個類的一個實例:如何用基類初始化繼承類?

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

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

,但在某些情況下,我需要序列化JSON的更多特性。我想我應該做第二個繼承類是這樣的:

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

如果我沒有解決的方式是錯誤的問題,我怎麼能初始化我的第二類的新實例與第一個實例並有一個從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對象將引用當前實例是Child類的實例,因此將包含所有屬性。

+0

謝謝。我有一個父類的對象在手,有沒有辦法從它創建一個子對象,或者我應該創建一個新的,並一個一個地分配屬性?這會拋出一個異常'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"}