将属性从父 class 提取到其子 class
Extracting properties from parent class to its sub class
我有以下 类:
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的属性?
有没有更有效的选择?或者这真的是怎么做到的?我只是在想,如果属性很多,这可能会很乏味..
提前致谢。 :)
您不能像这样 child.base = parent
将 parent class 分配给 child 的基数 object。您也不能像 var o = (child)parent; o.id=1;
那样将 paret class 转换为 child 您所能做的就是将构造函数添加到接收 parent [=] child class 17=] 并在该构造函数中工作。
你可以通过创建复制构造函数来实现这一点。无论如何,您必须在某处分配父级 class 属性,因为在这种情况下无法进行转换。
这是在父构造函数中分配父 属性 的复制构造函数方法。
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);
}
更新
如果您不能对您的父项和子项进行更改 class 那么如何在静态 class 中为父项 class 创建一个扩展方法,如下所示。
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 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的属性? 有没有更有效的选择?或者这真的是怎么做到的?我只是在想,如果属性很多,这可能会很乏味..
提前致谢。 :)
您不能像这样 child.base = parent
将 parent class 分配给 child 的基数 object。您也不能像 var o = (child)parent; o.id=1;
那样将 paret class 转换为 child 您所能做的就是将构造函数添加到接收 parent [=] child class 17=] 并在该构造函数中工作。
你可以通过创建复制构造函数来实现这一点。无论如何,您必须在某处分配父级 class 属性,因为在这种情况下无法进行转换。
这是在父构造函数中分配父 属性 的复制构造函数方法。
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);
}
更新
如果您不能对您的父项和子项进行更改 class 那么如何在静态 class 中为父项 class 创建一个扩展方法,如下所示。
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);
}
}
}
注意:这可能不适用于私有属性和字段。