C# 将属性从父类提取到其子类
我有以下课程:C# 将属性从父类提取到其子类,c#,oop,C#,Oop,我有以下课程: public class ParentClass { public string Name {get;set;} public int Age {get;set;} } public class SubClass : ParentClass { public int Id {get;set;} } 我有以下方法: public void InsertSubClass(Pa
public class ParentClass
{
public string Name {get;set;}
public int Age {get;set;}
}
public class SubClass : ParentClass
{
public int Id {get;set;}
}
我有以下方法:
public void InsertSubClass(ParentClass parentClass)
{
SubClass subClass = new SubClass();
subClass.Id = 1;
subClass.Age = parentClass.Age;
subClass.Name= parentClass.Name;
}
我如何重构这个方法,使我不需要将参数ParentClass的属性逐个分配到子类的属性中?
有没有更有效的替代方案?或者这真的是怎么做到的?我只是在想,如果房产很多,这可能会很乏味
提前感谢。:) 不能像这样将父类分配给子对象的基对象
child.base=parent
。此外,您不能将paret类强制转换为child-likevaro=(child)parent;o、 id=1代码>您所能做的就是将构造函数添加到接收父类的子类,并在该构造函数中工作。您不能像这样将父类分配给子类的基对象child.base=parent
。此外,您不能将paret类强制转换为child-likevaro=(child)parent;o、 id=1代码>您所能做的就是将构造函数添加到接收父类的子类中,并在该构造函数中工作。您可以通过创建复制构造函数来实现这一点。无论如何,您必须在某个地方指定父类属性,因为在这种情况下强制转换不起作用
public class ParentClass
{
public string Name { get; set; }
public int Age { get; set; }
public ParentClass()
{
}
//Copy constructor
public ParentClass(ParentClass parentClass)
{
this.Name = parentClass.Name;
this.Age = parentClass.Age;
}
}
public class SubClass : ParentClass
{
public int Id { get; set; }
public SubClass(ParentClass parentClass, int id) : base(parentClass)
{
this.Id = id;
}
}
下面是在父构造函数中分配父属性的复制构造函数方式
public class ParentClass
{
public string Name { get; set; }
public int Age { get; set; }
public ParentClass()
{
}
//Copy constructor
public ParentClass(ParentClass parentClass)
{
this.Name = parentClass.Name;
this.Age = parentClass.Age;
}
}
public class SubClass : ParentClass
{
public int Id { get; set; }
public SubClass(ParentClass parentClass, int id) : base(parentClass)
{
this.Id = id;
}
}
现在这个方法看起来是这样的
public static void InsertSubClass(ParentClass parentClass)
{
SubClass subClass = new SubClass(parentClass, 1);
}
更新
如果您不能对父类和子类进行更改,那么如何在静态类中为父类创建一个扩展方法,如下所示
public static void ShallowConvert<T, U>(this T parent, U child)
{
foreach (PropertyInfo property in parent.GetType().GetProperties())
{
if (property.CanWrite)
{
property.SetValue(child, property.GetValue(parent, null), null);
}
}
}
public static void shallwconvert(此T父级,U子级)
{
foreach(parent.GetType().GetProperties()中的PropertyInfo属性)
{
if(property.CanWrite)
{
SetValue(子,property.GetValue(父,null),null);
}
}
}
注意:这可能不适用于私有属性和字段。您可以通过创建复制构造函数来实现这一点。无论如何,您必须在某个地方指定父类属性,因为在这种情况下强制转换不起作用
下面是在父构造函数中分配父属性的复制构造函数方式
public class ParentClass
{
public string Name { get; set; }
public int Age { get; set; }
public ParentClass()
{
}
//Copy constructor
public ParentClass(ParentClass parentClass)
{
this.Name = parentClass.Name;
this.Age = parentClass.Age;
}
}
public class SubClass : ParentClass
{
public int Id { get; set; }
public SubClass(ParentClass parentClass, int id) : base(parentClass)
{
this.Id = id;
}
}
现在这个方法看起来是这样的
public static void InsertSubClass(ParentClass parentClass)
{
SubClass subClass = new SubClass(parentClass, 1);
}
更新
如果您不能对父类和子类进行更改,那么如何在静态类中为父类创建一个扩展方法,如下所示
public static void ShallowConvert<T, U>(this T parent, U child)
{
foreach (PropertyInfo property in parent.GetType().GetProperties())
{
if (property.CanWrite)
{
property.SetValue(child, property.GetValue(parent, null), null);
}
}
}
public static void shallwconvert(此T父级,U子级)
{
foreach(parent.GetType().GetProperties()中的PropertyInfo属性)
{
if(property.CanWrite)
{
SetValue(子,property.GetValue(父,null),null);
}
}
}
注意:这可能不适用于私有属性和字段。从发布的代码中可以看出,您正在创建两个不同的实例。InsertSubClass
方法看起来更像是在两个类之间转换值的方法。为了给出更好的答案,您可以在ParentClass
使用构造函数重载中发布如何将值分配给属性。如果属性很多,那么检查哪些属性是可以运行类的最小属性。如果属性在增加,则使用抽象。如果你不需要为base赋值意味着什么?在这些情况下提供默认值。根据发布的代码,看起来您正在创建两个不同的实例。InsertSubClass
方法看起来更像是在两个类之间转换值的方法。为了给出更好的答案,您可以在ParentClass
使用构造函数重载中发布如何将值分配给属性。如果属性很多,那么检查哪些属性是可以运行类的最小属性。如果属性在增加,则使用抽象。如果你不需要为base赋值意味着什么?在这些情况下提供默认值。谢谢Jenish,是的,这将起作用,但问题是不应修改类ParentClass。@wuU如果不想更改基类,则重载强制转换也将不起作用。在这种情况下,您必须逐个分配属性。谢谢Jenish,是的,这会起作用,但是问题是不应该修改类ParentClass。@wuU如果您不想更改基类,则重载Cast也不会起作用。在这种情况下,您必须逐个指定属性。