自定义数据注释继承以实现可重用性

Custom Data Annotations inheritance for reusablity

假设您有一个 class 和一个 属性 用于电子邮件,带有一些数据注释

public class Person
{
    [Display(Name = "Email address")]
    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [CustomDataAnnotation()]
    public string Email { get; set; }
}

现在您需要另一个 class 的电子邮件 属性 和相同的数据注释

public class Invoice
    {
        [Display(Name = "Email address")]
        [Required(ErrorMessage = "The email address is required")]
        [EmailAddress(ErrorMessage = "Invalid Email Address")]
        [CustomDataAnnotation()]
        public string Email { get; set; }
    }

有没有办法创建一个继承所有其他数据注释的新数据注释 [MyEmail]?像这样

    [Display(Name = "Email address")]
    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [CustomDataAnnotation()]
    public DataAnnoation MyEmail {get;set;}

然后可以像这样重复使用它。

public class Person
    {
        [MyEmail]
        public string Email { get; set; }
    }

public class Invoice
    {
        [MyEmail]
        public string Email { get; set; }
    }

我知道可以使用摘要 class,但我不喜欢将电子邮件 属性 隐藏在另一个 class 中,这样更难阅读。

public abstract class MyEmail
{
    [Display(Name = "Email address")]
    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [CustomDataAnnotation()]
    public string Email { get; set; }
}

public class Person : MyEmail {}
public class Invoice : MyEmail { }

任何使数据注释更具可重用性的建议都将受到赞赏。

您可以在 Person 和 Invoice class 之上使用 [MetadataType] 属性来使用您的 MyEmail class data.annatotaions 属性。您可以像下面这样实现。

[MetadataType(typeof(MyEmail))]
public class Person
{
    public string Email { get; set; }
}

[MetadataType(typeof(MyEmail))]
public class Invoice
{
    public string Email { get; set; }
}

public abstract class MyEmail
{
    [Display(Name = "Email address")]
    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [CustomDataAnnotation()]
    public string Email { get; set; }
}