繁体   English   中英

如何将派生和基础 class 对象组合成派生 class object

[英]How to combine derived and base class objects into derived class object

假设我有这种 model 结构。

class Abc{
public string A{get;set;}
public string B{get;set;}
}
class Xyz:Abc{
public string C{get;set;}
public string D{get;set;}
}

现在,在单独的 class 中的一种方法中,我从源中分别获取两个类的对象。

public Xyz Test(){
var abc = getAbcObject();
var xyz = getXyzObject();// this only initialize properties which are in Xyz class
}

这里我的方法是返回派生的 class 的 object。 那么如何将它们组合成派生的 class object? 我不想通过将基础对象的属性分配给派生的 object 来手动执行此操作。

编辑:我无法控制获取值的来源,也无法在那里进行任何更改。

我将重写测试并获取方法如下:

public Xyz Test()
{
    var xyz = new Xyz();
    getAbcObject(xyz);
    getXyzObject(xyz);
}
public void getAbcObject(Abc abc)
{
    abc.A = "A";
    abc.B = "B";
}
public void getXyzObject(Xyz xyz)
{
    xyz.C = "C";
    xyz.D = "D";
}

这样,每个 get 方法只对它知道的字段负责,您可以自由地创建适当的 class 的 object 一次,而无需创建可能稍后将被丢弃的基类的临时对象。 您避免创建临时对象并避免将属性从 object 复制到另一个。

提示:您甚至可以通过从 getXyzObject 中调用 getAbcObject 来避免方法调用。

编辑:根据 CaiusJard 的建议,我完全同意,并且基于我之前的提示.. 更好的方法声明应该是

public Xyz Test()
{
    var xyz = new Xyz();
    //FillAbcObject(xyz); // invoked by FillXyzObject
    FillXyzObject(xyz);
}
public void FillAbcObject(Abc abc)
{
    abc.A = "A";
    abc.B = "B";
}
public void FillXyzObject(Xyz xyz)
{
    FillAbcObject(xyz);

    xyz.C = "C";
    xyz.D = "D";
}

基于最近的 OP 编辑

我无法控制获取值的来源,也无法在那里进行任何更改。

我理解为“getAbcObject 和 getXYZObject 不可修改,我必须调用它们”

然后我会在类中实现类似于 CopyTo 方法的东西。

class Abc
{
    public string A { get; set; }
    public string B { get; set; }

    public virtual void CopyTo(Abc other)
    {
        other.A = this.A;
        other.B = this.B;
    }
}
class Xyz : Abc
{
    public string C { get; set; }
    public string D { get; set; }

    public override sealed void CopyTo(Abc other)
    {
        if (other is Xyz)
            this.CopyTo(other as Xyz);
        else
            base.CopyTo(other);
    }
    public virtual void CopyTo(Xyz other)
    {
        base.CopyTo(other);

        other.C = this.C;
        other.D = this.D;
    }
}

并更改测试方法如下:

public Xyz Test()
{
    var abc = getAbcObject();
    var xyz = getXyzObject();
    abc.CopyTo(xyz);
}

由于情况无法改变:复制属性没什么大不了的。

foreach (var prop in abc.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
    xyz.GetType().GetProperty(prop.Name).SetValue(xyz, prop.GetValue(abc));
}

[编辑] 也许检查 CanRead 和 CanWrite 的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM