Есть ли способ удалить атрибуты из унаследованного свойства?

Можно ли удалить атрибуты из унаследованных свойств? Я думал, что с помощью ключевого слова new я смогу это сделать...

 public class Person
 {
     [Required]
     public string FirstName { get; set; }

     [Required]
     public string LastName { get; set; }
 }

 public class Employee : Person
 {
     [Required]
     public string JobTitle { get; set; }

     public new string FirstName { get; set; }
 }

... но это вообще не работает. Меня это удивляет, потому что new специально предназначен для того, чтобы скрыть унаследованные члены.


person Sailing Judo    schedule 29.07.2010    source источник
comment
Как вы думаете, на каком основании это не работает?   -  person Ben Voigt    schedule 30.07.2010
comment
@Бен: я пробовал. У меня есть реальный проект, где это не работает. Я создал простой тестовый проект, чтобы проверить его без вмешательства большого количества кода, и он все еще не работает. Оба проекта являются asp.net mvc2. В обоих случаях скрытое свойство по-прежнему появляется по мере необходимости.   -  person Sailing Judo    schedule 30.07.2010
comment
Что ж, скрытое свойство base.FirstName помечено как обязательное. Новое свойство Employee.FirstName не требуется. Я не использую mvc2, поэтому больше ничем помочь не могу.   -  person Ben Voigt    schedule 30.07.2010
comment
Я знаю, что вы не указали в своем вопросе, но если вы используете Entity Framework, то Fluent API имеет приоритет. Это означает, что в вашем ModelBuilder вы можете сделать что-то вроде modelBuilder.Entity<Employee>().Property(s => s.FirstName) .IsOptional(); Если вы используете EF, пожалуйста, напишите это в своем вопросе, чтобы я мог дать правильный ответ :-)   -  person Worthy7    schedule 25.05.2017


Ответы (1)


Ваш класс Employee теперь имеет 2 свойства FirstName, одно из них по-прежнему [Required]...

Прямой ответ: нет, вы не можете удалить атрибуты, насколько мне известно. Это нарушило бы принцип замещения. Когда Сотрудник ЯВЛЯЕТСЯ Человеком, применяются свойства Person.FirstName.

И: ключевое слово new здесь только служит для подавления предупреждения «X скрывает член базового класса..». Это никак не влияет на семантику вашего кода.

person Henk Holterman    schedule 29.07.2010