如何用基类初始化继承类?
我有这个类的一个实例:如何用基类初始化继承类?
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字符串?
您可以在派生类中创建一个构造函数和对象映射,
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);
}
});
}
其实这是我想要的。只是我的问题是我希望映射自动发生,所以如果基类的属性改变,我的继承类不会过时。 – Blendester
我希望它不花费太多的努力,但一切都有成本..谢谢 – Blendester
您只需要创建子类的实例,即MyInheritedClass
,它将包含来自两个类的所有属性。
当您创建子类MyInheritedClass
的实例时,运行时将首先调用父类MyInheritedClass
的构造函数为父类成员分配内存,然后调用子类构造函数。
因此,Child类的实例将具有所有属性,并且在序列化对象时引用this
,因此它应该具有在json中序列化的所有属性。
注意:即使您在父类中声明的方法内部序列化对象,参考this
对象将引用当前实例是Child类的实例,因此将包含所有属性。
谢谢。我有一个父类的对象在手,有没有办法从它创建一个子对象,或者我应该创建一个新的,并一个一个地分配属性?这会抛出一个异常'MyInheritedClass child =(MyClass)parent;' – Blendester
您不能将基类对象分配给派生类对象。 –
那么如何在创建新的子对象时将父对象的值移动到子对象?我害怕如果我手动做,如果父代码被改变,并有更多的属性,我的继承类会过时。 – Blendester
号不能初始化基类派生实例目的。
但是您可以创建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"}
我想你是对你走错了路。 –
可能的重复https://*.com/questions/7987302/deserialize-classes-which-inherit-from-superclass-with-json-net – user3292642
@ A.T。引导我进入写入路径:V – Blendester