【发布时间】:2016-07-27 13:38:48
【问题描述】:
请参阅以下示例代码。
public interface I
{
int ID { get; set; }
}
public class B : I
{
public int ID { get; set; }
public string PropB { get; set; }
}
public class A : B
{
public string PropA { get; set; }
public IEnumerable<I> GetListOfBase()
{
// Attempt #1
var list1 = new List<I>();
B b1 = this as B;
list1.Add(b1);
// Attempt #2
var list2 = new List<I>();
B b2 = (B)this.MemberwiseClone();
list2.Add(b2);
return list1;
}
}
private static void TestGetListOfBase()
{
var a = new A() { ID = 1, PropA = "aaa", PropB = "bbb" };
var list = a.GetListOfBase();
}
在我的两次尝试中,列表都包含 A 的实例。我需要它包含 B 的实例。我试图避免创建新的 B,然后将 A 的属性复制到 B(我认为这会起作用!) .
编辑:我需要一个 B 列表的原因是稍后每个 B 都被传递到 NPoco(一个 .NET 微型 ORM,源自 PetaPoco)。 NPoco 获取类型的名称并使用它来确定要映射到的数据库表。因此,将正确类型的变量传递给方法至关重要。
【问题讨论】:
-
因为 A 是从 B 派生的,所以 A 的任何实例都是 B 的实例。任何可以使用 B 的地方,也可以使用 A。你能解释一下为什么你需要创建一个 B 列表吗?
-
这样我就可以将列表传递给 NPoco(一个 .NET 微型 ORM,源自 PetaPoco)。 NPoco 获取类型的名称并使用它来确定要映射到的数据库表。因此,将正确类型的变量传递给方法至关重要。
-
在这种情况下,您需要将新实例创建为 B 并从 A 的实例中复制值。您不能“伪造”类的类型。在这里使用“复制构造函数”可能会有所帮助。您确定要在持久化数据时省略 A 的所有值吗?
标签: c# inheritance clone derived-class base-class