Как добавить атрибуты к свойствам базового класса
У меня есть пара модельных классов:
public class MyModelBase
{
public string Name { get; set; }
}
public class MyModel : MyModelBase
{
public string SomeOtherProperty { get; set; }
}
Как MyModel может добавить атрибут [Обязательный] к свойству Name?
Ответы
Ответ 1
Попробуйте использовать класс метаданных. Это отдельный класс, на который ссылаются атрибуты, которые позволяют добавлять аннотации данных к классам модели косвенно.
например.
[MetadataType(typeof(MyModelMetadata))]
public class MyModel : MyModelBase {
... /* the current model code */
}
internal class MyModelMetadata {
[Required]
public string Name { get; set; }
}
Ответ 2
Объявить свойство в родительском классе как виртуальное:
public class MyModelBase
{
public virtual string Name { get; set; }
}
public class MyModel : MyModelBase
{
[Required]
public override string Name { get; set; }
public string SomeOtherProperty { get; set; }
}
Или вы можете использовать MetadataType для обработки проверки (пока вы говорите о DataAnnotations... иначе вы застряли с приведенным выше примером):
class MyModelMetadata
{
[Required]
public string Name { get; set; }
public string SomeOtherProperty { get; set; }
}
[MetadataType(typeof(MyModelMetadata))]
public class MyModel : MyModelBase
{
public string SomeOtherProperty { get; set; }
}
Ответ 3
Я отмечаю, что ни один из этих ответов на самом деле не называет базовое свойство Name правильно. Для переопределения следует написать что-то вроде следующего, чтобы у вас не было отдельного значения для нового свойства.
public class MyModelBase
{
public virtual string Name { get; set; }
}
public class MyModel : MyModelBase
{
[Required]
public override string Name { get { return base.Name; } set { base.Name = value; }
public string SomeOtherProperty { get; set; }
}
Ответ 4
Вы можете перегрузить базовое свойство с помощью "нового" ключевого слова.
public class MyModelBase
{
public string Name { get; set; }
}
public class MyModel : MyModelBase
{
[Required]
public new string Name {get; set;}
public string SomeOtherProperty { get; set; }
}