我有以下课程:
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的属性逐个分配到SubClass的属性中? 有没有更有效的替代方案?或者这真的是怎么做的?我只是想,如果属性很多,这可能是单调乏味的。
提前致谢。 :)
答案 0 :(得分:3)
你可以通过创建复制构造函数来实现这一点。无论如何,你必须在某处指定父类属性,因为在这种情况下,转换不起作用。
这是在父构造函数中指定父属性的复制构造方法。
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);
}
}
}
注意:这可能不适用于私有属性和字段。
答案 1 :(得分:1)
您不能将父类分配给子的基础对象,例如child.base = parent
。此外,您不能将paret类转换为像var o = (child)parent; o.id=1;
这样的子类。您可以做的就是将构造函数添加到接收父类的子类中,并在该构造函数中工作。