2010-10-15 9 views
6

Tengo una clase que hereda de X509Certificate2. Quiero que la propiedad NotAfter esté en UTC en lugar de la hora local. Soy bastante nuevo en C# y me preguntaba si lo que tengo a continuación es la mejor manera de hacerlo.C#: reemplaza una propiedad de la clase principal

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

EDITAR Cuando cambié a esto:

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

ReSharper se quejó de que "no hay propiedad adecuada para anular"

+0

¿Por qué? ¿Que estás tratando de hacer? – SLaks

+2

¿Qué hay de malo en agregar una propiedad 'NotAfterUtc' en su lugar? – LukeH

+0

De acuerdo con @LukeH: está intentando cambiar el contrato (significado) de una propiedad definida en la clase base. Eso casi nunca es una buena idea. Una propiedad separada tiene mucho más sentido para mí. –

Respuesta

9

Lo que has hecho allí es la ocultación de miembros. Si la clase va a derivar a partir ha marcado la propiedad como virtual, o está anulando desde su base (si tiene uno) que utilice el override palabra clave:

public override DateTime NotAfter 

El escondite miembro puede ser utilizado cuando la clase base no lo ha marcado como virtual; sin embargo, si alguien coloca una referencia de su clase en la clase base y accede al miembro, omitiría su ocultamiento new. Con herencia verdadera usando override, este problema no ocurre.

Como se ha señalado por alguien, esta propiedad no está marcado virtual:

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

escondite miembro le permitirá obtener en torno a este caso las personas utilicen la clase directamente, pero el momento en que alguien arroja su clase de nuevo a un tipo base, que reciben el valor 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

Gracias fue muy útil. – FunLovinCoder

0

No, de esta manera usted solo está ocultando la propiedad con una nueva.

Utilice "anular" en lugar de "nuevo". Ver aquí para más detalles sobre la "nueva" palabra clave como modificador: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

EDIT: Como lo mencionan en el comentario anterior, la propiedad en X509Certificate2 no está marcado como virtual, por lo anulando no es posible en este caso.

+2

No es 'virtual'. – SLaks

0

Métodos/Propiedades en C# no son virtuales por defecto (como si estuvieran en Java). ¿Estás seguro de que tu propiedad NotAfter se define como virtual en la clase base?

Cuestiones relacionadas