从父类到其子类的属性提取

时间:2015-01-29 04:51:43

标签: 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(ParentClass parentClass)
    {
        SubClass subClass = new SubClass();
        subClass.Id = 1;
        subClass.Age = parentClass.Age;
        subClass.Name= parentClass.Name;


    }

如何以这样的方式重构此方法:我不需要将参数ParentClass的属性逐个分配到SubClass的属性中? 有没有更有效的替代方案?或者这真的是怎么做的?我只是想,如果属性很多,这可能是单调乏味的。

提前致谢。 :)

2 个答案:

答案 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;这样的子类。您可以做的就是将构造函数添加到接收父类的子类中,并在该构造函数中工作。