2010-10-15 4 views
6

У меня есть класс, который наследуется от X509Certificate2. Я хочу, чтобы свойство NotAfter было в UTC, а не по местному времени. Я довольно новичок в C# и задавался вопросом, лучший ли способ сделать это у меня ниже?C#: переопределить свойство родительского класса

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

EDIT Когда я изменил его на это:

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

Resharper жаловался, что «Существует не подходит свойство для перенастройки»

+0

Почему? Что ты пытаешься сделать? – SLaks

+2

Что случилось с добавлением свойства 'NotAfterUtc'? – LukeH

+0

Согласитесь с @LukeH - вы пытаетесь изменить контракт (значение) свойства, определенного в базовом классе. Это почти никогда не бывает хорошей идеей. Отдельное свойство имеет для меня гораздо больше смысла. –

ответ

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

0

Нет, таким образом, вы просто Скрытие свойство с новым.

Пожалуйста, используйте «переопределить» вместо «нового». См. Здесь подробную информацию о «новом» ключевом слове в качестве модификатора: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

EDIT: Как указано в комментарии ниже, свойство в X509Certificate2 не помечено как виртуальное, поэтому переопределение в этом случае невозможно.

+2

Это не 'виртуальный'. – SLaks

0

Методы/свойства в C# не являются виртуальными по умолчанию (например, они находятся в Java). Вы уверены, что ваше свойство NotAfter определено как виртуальное в базовом классе?

Смежные вопросы