在C#中,您可以通过为其分配基础对象的副本来创建新的继承对象吗?

时间:2009-10-05 02:34:43

标签: c# linq-to-sql inheritance

因此,如果C类继承自B类并且有一个额外的属性,我是否可以通过传递一个已经存在B类的对象来创建C类的新对象,它将使额外属性为null或运行一些LINQ到SQL以查看额外属性应该是什么(例如对于计数器等)?

C c = new C();
B b = bRepo.getBbyID(id);
c = b;
c.extraProperty = bRepo.getCountBybID(b.ID);

如果可行,我可以用Cs和B的IQueryable做同样的事吗?

2 个答案:

答案 0 :(得分:3)

没有。 B不保证是C,因此您不能将B存储在只能容纳Cs的变量中。 (动物不能保证是Llama,所以你不能创建一个通用动物并将它存储在一个Llama变量中。)

但是,您可以提供一种从B构造C实例的方法 - 通过让C复制B中的属性,或者让C将B存储为私有成员,并委托属性getter和setter到包含的B.然后你的代码看起来像:

B b = brepo.GetBById(id);
C c = new C(b);
c.extraProperty = brepo.GetCountByBId(b.Id);

同样的问题适用于Bs的IQueryable。如果它们实际上不是Cs,你就不能假装它们,而不是在它们上面设置extraProperty。你可以做的是使用OfType运算符选择那些Cs,尝试使用Cast运算符将它们转换为Cs,或者使用Select运算符和上面提到的技术之一从查询的Bs创建新的Cs,例如: bs.Select(b => new C(b))

答案 1 :(得分:0)

您无法按照指定的方式执行此操作。要获得相同的结果,您可以将所有属性从B实例复制到C实例,然后设置新属性。但是,这通常表明您可能需要重新考虑对象模型。例如,你可以让C上有一个B和其他属性而不是C是B.这对于像计数器这样的新属性是有意义的。您可以拥有这样的类层次结构:

class B
{
    string SomeValue1 { get; set; }
    int SomeValue2 { get; set; }
    decimal SomeValue3 { get; set; }
} 

interface ICountable<T>
{
    T Value { get; }
    int Count { get; }
}

class C : ICountable<B>
{
    B Value { get; set; }
    int Count { get; set; }
}