2010-10-15 18 views
6

J'ai une classe qui hérite de X509Certificate2. Je souhaite que la propriété NotAfter soit en heure UTC plutôt qu'en heure locale. Je suis assez nouveau à C# et je me demandais si ce que j'ai ci-dessous est la meilleure façon de le faire?C#: remplace une propriété de la classe parent

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

EDIT Lorsque je l'ai changé à ceci:

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

ReSharper se plaint que "Il n'y a pas la propriété appropriée pour override"

+0

Pourquoi? Qu'essayez-vous de faire? – SLaks

+2

Quel est le problème avec l'ajout d'une propriété 'NotAfterUtc' à la place? – LukeH

+0

D'accord avec @LukeH - vous essayez de changer le contrat (le sens) d'une propriété définie dans la classe de base. Ce n'est presque jamais une bonne idée. Une propriété séparée me semble beaucoup plus logique. –

Répondre

9

Ce que vous avez fait ici est la dissimulation de membres. Si la classe que vous dérivez de a marqué la propriété comme virtual, ou est la redéfinir de sa base (si elle en a un) que vous utilisez le mot-clé override:

public override DateTime NotAfter 

La cachette membre peut être utilisé lorsque la classe de base ne l'a pas marqué virtual, cependant, si quelqu'un jette une référence de votre classe dans la classe de base et accède au membre, il contourne votre new dissimulation. Avec l'héritage vrai utilisant override, ce problème ne se produit pas.

Comme il a été constaté par une personne, cette propriété n'est pas marqué virtual:

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

cachette membre vous permettra de contourner ce problème si les gens utilisent votre classe directement, mais le moment où quelqu'un jette votre classe Retour à un type de base, ils obtiennent la valeur de base:

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

Merci, c'était très utile. – FunLovinCoder

0

Non, de cette façon vous êtes juste cacher la propriété avec un nouveau.

Veuillez utiliser "override" au lieu de "new". Voir ici pour plus de détails sur le "nouveau" mot-clé en tant que modificateur: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

EDIT: Comme mentionné dans le commentaire ci-dessous, la propriété dans X509Certificate2 n'est pas marquée comme virtuelle, donc il n'est pas possible de la surcharger dans ce cas.

+2

Ce n'est pas "virtuel". – SLaks

0

Méthodes/Propriétés en C# ne sont pas virtuelles par défaut (comme ils sont en Java). Êtes-vous sûr que votre propriété NotAfter est définie comme virtuelle dans la classe de base?