如何创建包含B实例的List <i>,给定A的实例(A派生自B和B实现I)?

时间:2016-04-06 22:07:15

标签: c# inheritance clone derived-class base-class

请参阅以下示例代码。

scala> object Factory {
     |   onLoad()
     |   def apply() = "new object"
     |   def onLoad() = println("onload")
     | }
defined object Factory
// no onLoad triggered yet

scala> Factory()
onload
res0: String = new object
// onLoad was triggered

scala> Factory()
res1: String = new object
// onLoad was not triggered

在我的两次尝试中,列表都包含A的实例。我需要它来包含B的实例。我试图避免创建一个新的B,然后将A的属性复制到B(我假设它会起作用!)

编辑:我需要B列表的原因是后来每个B都被传递到NPoco(一个.NET微型ORM,源自PetaPoco)。 NPoco获取类型的名称并使用它来确定要映射到的数据库表。因此,将正确类型的变量传递给方法至关重要。

2 个答案:

答案 0 :(得分:1)

不,没有办法将派生类的实例“转换”为基类的实例。您必须创建基类和复制属性的新实例。

有多种方法可以做到这一点,包括手动复制每个属性(适用于少量属性)。这个操作经常称为“映射”(希望它有助于您搜索工具)。

请注意,如果您对列表Enumerable.OfType<T>()Enumerable.Cast<T>()的后续类型不同,那么ToList()就可以在单个语句中解决它。

答案 1 :(得分:0)

您可以使用copy constructor轻松创建类型B的实例,给定类型A的实例(或任何可分配给B的实例):

public class B : I
{
    public int ID { get; set; }
    public string PropB { get; set; }

    public B(source B)
    {
        // copy values
        this.ID = source.ID;
        this.PropB = source.PropB;
    }
}

您可以这样称呼它:

A instanceOfA = new A();
B instanceOfB = new B(instanceOfA);
// typeof(instanceOfB) == B