[英]Set property of derived class on base class' instance
我有一个这样的基类:
class Document {
int number {get; set;}
double sum {get; set;}
}
...和两个派生类:
class Bill : Document {
double advance {get; set;}
}
class Quote : Document {
double discount {get; set;}
}
在编译时,我知道将要处理Document
类型的对象。 但是,只有在运行时,我才能知道它是Bill
还是Quote
。
我需要根据类型执行特定的操作,例如:
if (myDoc.GetType() == typeof(Bill)) {
myDoc.advance = 1000; //<-- can't find "advance"
}
..但我不能那样编译,因为无法从基实例访问派生类的属性。
myDoc.advance
只能编译如果编译器在编译时告诉myDoc
是Bill
。 否则, myDoc
只是一个Document
并且该类型没有advance
成员。
进行类似的类型检查不会修改myDoc
的静态类型。 相反,您必须先将其类型转换为Bill
:
Bill myBill = (Bill)myDoc;
myBill.advance = 1000;
请注意,您应该使用is
运算符来验证myDoc
是Bill
,而不是使用检查确切的运行时类型的GetType()
。 您甚至可以使用C#中较新的模式匹配语法来使此更好:
if (myDoc is Bill myBill) {
myBill.advance = 1000;
}
最后,请注意,通用约定是在PascalCase中用C#编写属性(即Advance
, Number
, Sum
和Discount
)。
另请注意,默认情况下,类成员是私有的,因此您仍然无法访问这些属性。 因此,您必须在属性定义前面添加一个public
。
如果您使用的是C#7.0+,则模式匹配是解决此问题的好方法
if(myDoc is Bill bill)
{
bill.Advance = 1000;
}
else if(myDoc is Quote quote)
{
quote.Discount = 1000;
}
您可以简单地将其转换为:
if (myDoc.GetType() == typeof(Bill))
{
((Bill)myDoc).advance = 1000;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.