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;
}

感谢您提供的解决方案,感谢您在命名约定和访问器方面付出的额外努力!感谢您提供的解决方案,感谢您在命名约定和访问器方面付出的额外努力!