2010-10-15 237 views
6

我有一个继承自X509Certificate2的类。我希望NotAfter属性使用UTC而不是本地时间。我对C#很陌生,想知道下面是我做的最好的方法吗?C#:覆盖父类的属性

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

编辑 当我把它改成这样:

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

ReSharper的抱怨说,“没有了覆盖合适的物业”

+0

为什么?你想做什么? – SLaks 2010-10-15 15:59:12

+2

添加'NotAfterUtc'属性会出现什么问题? – LukeH 2010-10-15 16:00:37

+0

同意@LukeH - 您试图更改基类中定义的属性的合同(含义)。这几乎不是一个好主意。一个单独的属性对我来说更有意义。 – 2010-10-15 16:02:08

回答

9

你在那里做的是会员隐藏。如果你是从派生类具有显着的财产virtual,或者是从它的基本覆盖它(如果有的话),你使用override关键字:

public override DateTime NotAfter 

成员隐藏时,可以使用的基类没有标记virtual,但是如果有人将你的课程引用到基类并访问了成员,他们会绕过你的隐藏new。如果使用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. 
+0

非常感谢您的帮助。 – FunLovinCoder 2010-10-15 16:56:23

0

没有,这样你只是躲在财产与一个新的。

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

编辑:正如在下面的注释中提到的,X509Certificate2中的属性未标记为虚拟,因此在此情况下重写它是不可能的。

+2

它不是'虚拟'的。 – SLaks 2010-10-15 15:58:38

0

方法/ C#中的属性是不是虚拟的默认(就像他们在Java)。你确定你的NotAfter属性在基类中被定义为虚拟的吗?