C#:覆盖父类的属性

Fun*_*der 6 c# inheritance properties

我有一个继承自X509Certificate2的类.我希望NotAfter属性是UTC而不是本地时间.我对C#很陌生,并且想知道我下面的内容是否是最好的方法呢?

internal class Certificate : X509Certificate2
{
    public new DateTime NotAfter 
    {
        get { return base.NotAfter.ToUniversalTime(); }
    }
Run Code Online (Sandbox Code Playgroud)

编辑 当我把它更改为:

public override DateTime NotAfter 
{
    get { return base.NotAfter.ToUniversalTime(); }
}
Run Code Online (Sandbox Code Playgroud)

Resharper抱怨说"没有合适的财产可以覆盖"

Ada*_*rth 10

你在那里做的是成员隐藏.如果您派生的类已将该属性标记为virtual,或者从它的基础覆盖它(如果有的话),则使用override关键字:

public override DateTime NotAfter
Run Code Online (Sandbox Code Playgroud)

当基类没有标记它时virtual,可以使用成员隐藏,但是如果有人将您的类的引用强制转换为基类并访问该成员,则它们将绕过您的new隐藏.使用true继承时override,不会发生此问题.

正如有人所指出的那样,这个属性没有标记virtual:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.notafter.aspx

如果人们直接使用你的类,会员隐藏将允许你解决这个问题,但是当有人将你的类强制转换回基类型时,他们会得到基值:

class MyClass : Cert...

MyClass c = new MyClass();
DateTime foo = c.NotAfter; // Your newly specified property.

Cert cBase = (Cert)c;
foo = cBase.NotAfter; // Oops, base value.  Inheritance cures this, but only with virtual members.
Run Code Online (Sandbox Code Playgroud)