C# 在C语言中,你能通过给一个新的继承对象分配一个基础对象的副本来创建它吗?
因此,如果类C继承自类B并有一个额外的属性,我是否可以通过向它传递一个已经存在于类B中的对象来创建一个新的类C对象,并且它将保留额外的属性null,或者运行一些LINQ to SQL来查看额外的属性应该是什么,比如计数器,等等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 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