C#:覆盖父类的属性

我有一个inheritance自X509Certificate2的类。 我希望NotAfter属性是UTC而不是本地时间。 我对C#很陌生,想知道下面我有什么是最好的方法吗?

internal class Certificate : X509Certificate2 { public new DateTime NotAfter { get { return base.NotAfter.ToUniversalTime(); } } 

编辑当我将其更改为:

 public override DateTime NotAfter { get { return base.NotAfter.ToUniversalTime(); } } 

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

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

 public override DateTime NotAfter 

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

正如某人所指出的,此属性未标记为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. 

不,这种方式你只是用一个新的隐藏属性。

请使用“覆盖”而不是“新”。 有关“new”关键字作为修饰符的详细信息,请参阅此处: http : //msdn.microsoft.com/en-us/library/435f1dw2.aspx

编辑:如下面的评论中所提到的,X509Certificate2中的属性未标记为虚拟,因此在这种情况下无法覆盖它。

默认情况下,C#中的方法/属性不是虚拟的(就像它们在Java中一样)。 您确定您的NotAfter属性在基类中被定义为虚拟吗?