Можно ли наследовать аннотации данных в C#?

Могу ли я наследовать аннотацию данных "пароль" в другом классе?

    public class AccountCredentials : AccountEmail
{
    [Required(ErrorMessage = "xxx.")]
    [StringLength(30, MinimumLength = 6, ErrorMessage = "xxx")]
    public string password { get; set; }
}

Другой класс:

    public class PasswordReset : AccountCredentials
{
    [Required]
    public string resetToken { get; set; }
    **["use the same password annotations here"]**
    public string newPassword { get; set; }
}

Мне приходится использовать разные модели из-за вызовов API, но я бы хотел избежать необходимости поддерживать два определения для одного и того же поля. Спасибо!

Дополнение: что-то вроде

[UseAnnotation[AccountCredentials.password]]
public string newPassword { get; set; }

2 ответа

Решение

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

    public class AccountEmail { }

    public class AccountCredentials : AccountEmail
    {
        public Password Password { get; set; }
    }

    public class PasswordReset : AccountCredentials
    {
        [Required]
        public string ResetToken { get; set; }

        public Password NewPassword { get; set; }
    }

    public class Password
    {
        [Required(ErrorMessage = "xxx.")]
        [StringLength(30, MinimumLength = 6, ErrorMessage = "xxx")]
        public string Value { get; set; }

        public override string ToString()
        {
            return Value;
        }
    }

Возможно, это стало золотым молотом для меня, но в последнее время я добился большого успеха в этом, особенно когда мне был предоставлен выбор между созданием базового класса или принятием этого общего поведения и инкапсулированием его в объекте. Наследование может выйти из-под контроля довольно быстро.

В базовом классе вы можете сделать это virtual свойство и изменить его override в производном классе. Тем не менее, это не будет наследовать атрибут, мы делаем хитрость здесь:

public class AccountCredentials : AccountEmail
{
 [Required(ErrorMessage = "xxx.")]
 [StringLength(30, MinimumLength = 6, ErrorMessage = "xxx")]
 public virtual string password { get; set; }
}

public class PasswordReset : AccountCredentials
{
 [Required]
 public string resetToken { get; set; }
 public override string password { get; set; }
}
Другие вопросы по тегам