C #: переопределить свойство родительского classа

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

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

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

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

Ресарпер жаловался, что «для переопределения нет подходящего свойства»

То, что вы там сделали, – это скрытие членов. Если class, из которого вы выходите, помечает свойство как virtual или переопределяет его из его базы (если он есть), вы используете ключевое слово override :

 public override DateTime NotAfter 

Скрытие элемента может использоваться, когда базовый class не отметил его virtual , однако, если кто-то передал ссылку вашего classа в базовый class и получил доступ к члену, они обойдут ваше new скрытие. С истинным наследованием с использованием override эта проблема не возникает.

Как было отмечено кем-то, это свойство не отмечено virtual :

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

Скрытие элемента позволит вам обойти это, если люди используют ваш class напрямую, но в тот момент, когда кто-то возвращает ваш class обратно к базовому типу, они получают базовое значение:

 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. 

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

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

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

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