C# 在C语言中,你能通过给一个新的继承对象分配一个基础对象的副本来创建它吗?

C# 在C语言中,你能通过给一个新的继承对象分配一个基础对象的副本来创建它吗?,c#,linq-to-sql,inheritance,C#,Linq To Sql,Inheritance,因此,如果类C继承自类B并有一个额外的属性,我是否可以通过向它传递一个已经存在于类B中的对象来创建一个新的类C对象,并且它将保留额外的属性null,或者运行一些LINQ to SQL来查看额外的属性应该是什么,比如计数器,等等 C c = new C(); B b = bRepo.getBbyID(id); c = b; c.extraProperty = bRepo.getCountBybID(b.ID); 如果可以,我可以对Cs和Bs的IQueryable执行相同的操作吗?您不能按照指定的

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

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

如果可以,我可以对Cs和Bs的IQueryable执行相同的操作吗?

您不能按照指定的方式执行此操作。为了获得相同的结果,您可以将所有属性从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; }
}

您不能按指定的方式执行此操作。为了获得相同的结果,您可以将所有属性从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; }
}

不可以。ab不能保证是C,所以不能将ab存储在只能保存Cs的变量中。动物不能保证是骆驼,因此不能创建通用动物并将其存储在骆驼变量中

但是,您可以提供一种从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。Selectb=>new Cb。

否。A B不保证是C,因此,不能将B存储在只能保存Cs的变量中。动物不能保证是骆驼,因此不能创建通用动物并将其存储在骆驼变量中

但是,您可以提供一种从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.Selectb=>new Cb