我有一个继承自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抱怨“没有合适的财产可以覆盖”
答案 0 :(得分:9)
你所做的是成员隐藏。如果您派生的类已将该属性标记为virtual
,或者将其覆盖在其基础上(如果有的话),则使用override
关键字:
public override DateTime NotAfter
当基类没有将其标记为virtual
时,可以使用成员隐藏,但是如果有人将您的类的引用强制转换为基类并访问该成员,则会绕过您的new
躲了起来。使用override
进行真正的继承,不会发生此问题。
正如某人所指出的,此属性未标记为virtual
:
如果人们直接使用您的课程,会员隐藏将允许您解决此问题,但是当某人将您的课程强制转换为基础类型时,他们会获得基本值:
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.
答案 1 :(得分:0)
不,这样你只是用一个新的隐藏属性。
请使用“覆盖”而不是“新”。有关“new”关键字作为修饰符的详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/435f1dw2.aspx
编辑:正如下面的评论中所提到的,X509Certificate2中的属性未标记为虚拟,因此在这种情况下无法覆盖它。
答案 2 :(得分:0)
默认情况下,C#中的方法/属性不是虚拟的(就像它们在Java中一样)。您确定您的NotAfter属性在基类中被定义为虚拟吗?