2010-10-15 18 views
6

X509Certificate2'den miras alan bir sınıfa sahibim. NotAfter özelliğinin yerel saat yerine UTC'de olmasını istiyorum. Ben C# için oldukça yeni ve aşağıda sahip olduğum şeyi yapmanın en iyi yolu olup olmadığını merak ediyordum?C#: üst sınıfın bir özelliğini geçersiz kılma

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

DÜZENLEME bu bunu değiştiğinde: Resharper

+0

Neden? Ne yapmaya çalışıyorsun? – SLaks

+2

Bunun yerine bir 'NotAfterUtc' özelliği ekleme ile ilgili sorun nedir? – LukeH

+0

@LukeH ile katılıyorum - temel sınıfta tanımlanan bir özelliğin sözleşmesini (anlamını) değiştirmeye çalışıyorsunuz. Bu neredeyse hiç iyi bir fikir değildir. Ayrı bir mülk benim için çok daha mantıklı. –

cevap

9

Ne yaptınız üye gizleme var. Eğer çıkartılan sınıf virtual olarak mülk işaretlemiştir, ya da (eğer varsa) Eğer override anahtar kelime kullanmak o tabanından geçersiz kılma ise:

public override DateTime NotAfter 

üye gizleme taban sınıfı kullanılabilir virtual işaretlemedi, ancak birisi sınıfınızın bir referansını temel sınıfa aktarır ve üyeye erişirse, new gizlemenizi atlar. override kullanarak gerçek kalıtımla, bu sorun oluşmaz.

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

Üye gizleme insanlar doğrudan sınıfını kullanın eğer bunun üstesinden sağlayacak, fakat an birisi sınıfını atmalarını: birileri tarafından belirtildiği gibi

bu tesis virtual işaretlenmemiş

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

Bu çok yardımcı oldu. – FunLovinCoder

0

Hayır, sadece saklandıkları bu şekilde "geçersiz kılma için uygun özellik yoktur" şikayet

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

yeni bir özellik.

Lütfen "yeni" yerine "geçersiz kıl" seçeneğini kullanın. Değiştirici olarak "yeni" anahtar sözcüğü ile ilgili ayrıntılar için buraya bakın: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

DÜZENLEME: Aşağıdaki yorumda belirtildiği gibi, X509Certificate2'deki özellik sanal olarak işaretlenmez, bu nedenle bu durumda geçersiz kılınamaz.

+2

Sanal değil. – SLaks

0

Yöntemleri/C# Özellikleri (bunlar Java olduğu gibi) varsayılan olarak sanal değildir: geri taban türüne, onlar taban değeri olsun. NotAfter özelliğinizin temel sınıfta sanal olarak tanımlandığından emin misiniz?