C# 在基类上设置派生类的属性';实例
我有这样一个基类:C# 在基类上设置派生类的属性';实例,c#,C#,我有这样一个基类: 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类型的对象。然而,只有在运行时我才
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
类型的对象。然而,只有在运行时我才知道它是一张账单
还是一张报价
我需要根据类型执行特定操作,例如:
if (myDoc.GetType() == typeof(Bill)) {
myDoc.advance = 1000; //<-- can't find "advance"
}
if(myDoc.GetType()==typeof(Bill)){
如果您使用的是C#7.0,那么myDoc.advance=1000;//模式匹配是一种很好的处理方法+
如果您使用的是C#7.0,那么模式匹配是处理此问题的一个好方法+
myDoc.advance
只能在编译器在编译时判断出myDoc
是Bill
时进行编译。否则,myDoc
只是一个文档
,并且该类型没有advance
成员
执行这样的类型检查不会修改myDoc
的静态类型。相反,您必须先将其输入到账单中:
Bill myBill = (Bill)myDoc;
myBill.advance = 1000;
请注意,与其使用检查确切运行时类型的GetType()
,不如使用is
操作符来验证myDoc
是否为Bill
if (myDoc is Bill myBill) {
myBill.advance = 1000;
}
最后,请注意,常见的惯例是用PascalCase(即,预付款
,数字
,总和
和折扣
)以C#形式写入属性
另外请注意,类成员默认为私有的,因此您仍然无法访问这些属性。因此,您必须在属性定义前面添加一个public
。myDoc.advance
只有在编译时编译器可以告诉您myDoc
是账单时才能编译。否则,myDoc
只是一个文档
,该类型没有advance
成员
执行这样的类型检查不会修改myDoc
的静态类型。相反,您必须先将其输入到账单中:
Bill myBill = (Bill)myDoc;
myBill.advance = 1000;
请注意,与其使用检查确切运行时类型的GetType()
,不如使用is
操作符来验证myDoc
是否为Bill
if (myDoc is Bill myBill) {
myBill.advance = 1000;
}
最后,请注意,常见的惯例是用PascalCase(即,预付款
,数字
,总和
和折扣
)以C#形式写入属性
还请注意,默认情况下类成员是私有的,因此您仍然无法访问这些属性。因此您必须在属性定义前面添加一个public
。您可以简单地强制转换它:
if (myDoc.GetType() == typeof(Bill))
{
((Bill)myDoc).advance = 1000;
}
您可以简单地将其转换为:
if (myDoc.GetType() == typeof(Bill))
{
((Bill)myDoc).advance = 1000;
}
感谢您提供的解决方案,感谢您在命名约定和访问器方面付出的额外努力!感谢您提供的解决方案,感谢您在命名约定和访问器方面付出的额外努力!