Запретить наследование атрибутов проверки в модели

Я использую базовую модель контактов, которую наследуют другие пользовательские классы моделей контактов.

public class BaseContactModel
{
    [Required(ErrorMessage = "Firstname is required")]
    public virtual string FirstName { get; set; }
}

Базовая модель контакта использует атрибуты проверки, чтобы пометить свойство обязательно, но в некоторых случаях я хочу переопределить или остановить это. Это будет возможно?

public class ContactModel : BaseContactModel
{
    [NotRequired]
    public override string FirstName { get; set; }
}

Я попытался использовать новый атрибут проверки NotRequired, чтобы просто вернуть значение true, но похоже, что атрибуты просто суммируются, поэтому Required & NotRequired запущены, а проверка не пройдена.

При поиске решений (которые я не смог найти) я обнаружил, что некоторые несвязанные атрибуты имеют свойство "унаследовано", но я не вижу этого в собственных атрибутах проверки в System.ComponentModel.DataAnnotations.

Это безнадежное дело? Нужно ли накатывать свои собственные версии, которые бы поддерживали отключение наследования? Любая помощь с благодарностью.

2 ответа

Решение

Смотрите это ниже, я создал один класс Model что наследует от другого BaseModel, использовал новое ключевое слово, затем проверял один из каждого экземпляра. Из того, что я вижу, они оба используют базовые атрибуты.

Я добавил класс управления ControlModel для ясности в процедуре проверки.

class Program
{
    static void Main(string[] args)
    {
        ValidationTest<Model>();
        ValidationTest<BaseModel>();
        ValidationTest<ControlModel>();

        Console.Read();
    }

    private static void WriteAttributeInfo<T>()
    {
        Console.WriteLine(string.Concat(typeof(T), " attributes:"));
        typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList();
    }

    private static void ValidationTest<T>()
    {
        object obj = Activator.CreateInstance<T>();
        Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>())));
    }
}

class ControlModel
{
    public string FirstName { get; set; }

    public string Email { get; set; }
}

class BaseModel
{
    [RequiredAttribute]
    public virtual string FirstName { get; set; }

    [RequiredAttribute]
    public virtual string Email { get; set; }
}

class Model : BaseModel
{
    public new string FirstName { get; set; }

    public new string Email { get; set; }
}

ConsoleApplication1.Model test: isValid = False

ConsoleApplication1.BaseModel test: isValid = False

ConsoleApplication1.ControlModel test: isValid = True

Из этого примера видно, что вы не можете переопределить / скрыть / игнорировать унаследованные обязательные атрибуты проверки (еще не пробовали другие).

Это может быть тот случай, когда вы действительно хотите новую собственность

 public class ContactModel : BaseContactModel 
{
        [NotRequired]
        public new string FirstName { get; set; } 
}
Другие вопросы по тегам