2017-06-22 116 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"}