Можно ли наследовать аннотации данных в 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; }
}