Наследование аннотаций данных от абстрактного класса к дочернему классу через интерфейс?

Это мой родительский абстрактный класс:

public abstract class PersonViewModel:IPersonViewModel
{
    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertYourMobileNumber")]
    [Display(Name = "MobileNumber")]
    //--RegularExpression ========================(1234567890)===!( ValiAsr1)
    [RegularExpression(pattern: @"(\d{10})", ErrorMessage = "ErrorNotFindMobileNumber")]
    #endregion
    public string MobileNumber { get; set; }
    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertPassword")]
    [Display(Name = "Password")]
    [DataType(DataType.Password)]
    #endregion
    public string Password { get; set; }
    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertReTypePassword")]
    [Display(Name = "ReTypePassword")]
    [DataType(DataType.Password)]
    #endregion
    public string ReTypePassword { get; set; }
}

И это мой интерфейс:

public interface IPersonViewModel
{
    string MobileNumber { get; set; }
    string Password { get; set; }
    string ReTypePassword { get; set; }

}

И класс человека:

public abstract class Person
{
    #region MainProperties

    public Guid PersonId { get; set; }
    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertYourFirstName")]
    [Display(Name = "FirstName")]
    [StringLength(15, MinimumLength = 2, ErrorMessage = "ErrorMin2Max15Words")]
    [RegularExpression(pattern: @"(^[^-\s\d*]\D*$)", ErrorMessage = "ErrorNotAllowWhitspaceInFirstAndNumbers")]
    #endregion
    #region EFValidation
    [Column(TypeName = "varchar(max)")]
    #endregion
    public string FirstName { get; set; }

    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertYourLastName")]
    [Display(Name = "LastName")]
    [StringLength(15, MinimumLength = 2, ErrorMessage = "ErrorMin2Max15Words")]
    [RegularExpression(pattern: @"(^[^-\s\d*]\D*$)", ErrorMessage = "ErrorNotAllowWhitspaceInFirstAndNumbers")]
    #endregion
    #region EFValidation
    [Column(TypeName = "varchar(max)")]
    #endregion
    public string LastName { get; set; }

    #region DataValidatorModel
    [Required]
    [Display(Name = "Gender")]
    #endregion
    #region EFValidation
    [Column(TypeName = "varchar(max)")]
    #endregion
    public string Gender { get; set; }

    #region DataValidatorModel
    [Required(ErrorMessage = "ErrorInsertYourProfileImage")]
    [Display(Name = "ProfileImage")]
    //--RegularExpression ========================(test.jpg)||(folder/test.jpg)
    [RegularExpression(pattern: @"([^\s]+(\.(?i)(jpg|png|gif|bmp))$)", ErrorMessage = "ErrorItsNotImageFile")]
    #endregion
    #region EFValidation
    [Column(TypeName = "varchar(max)")]
    #endregion
    public string ProfileImage { get; set; }
    #endregion

    public string FullName => $"{FirstName} {LastName}";
}

И это мой детский класс:

public class UserViewModel:Person,IPersonViewModel
{
    #region MainProperties
    #region DataValidatorModel
    [Display(Name ="Email")]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$",ErrorMessage ="ErrorValidEmail")]
    #endregion
    public string Email { get; set; }

    public string MobileNumber { get; set; }

    public string Password { get; set; }

    public string ReTypePassword { get; set; }
    #endregion
}

Мой вопрос, как я могу наследовать аннотации данных в дочерний класс по интерфейсу?

Я не могу сделать это напрямую без интерфейса, потому что это, очевидно, множественное наследование.

Это хороший способ сделать это?

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

На самом деле я не хочу иметь более одной ссылки на аннотации данных. Есть ли способ сделать это?

1 ответ

Решение

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

Атрибуты, определенные в интерфейсе, не передаются классам, которые реализуют этот интерфейс. Вы просто не можете сделать это:

public interface IPersonViewModel
{
    [Required]
    string MobileNumber { get; set; }
}

public class PersonViewModel : IPersonViewModel
{
    // this will NOT get the [Required] attribute from the interface
    public string MobileNumber { get; set; }
}
Другие вопросы по тегам