是否可以在C#中继承数据注释?

时间:2014-03-31 16:42:32

标签: c# data-annotations

我可以在另一个类中继承“密码”数据注释吗?

    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 个答案:

答案 0 :(得分:5)

考虑favoring composition over inheritance并使用Money Pattern

    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;
        }
    }

也许它已经成为我的一把金钥匙,但最近我在这方面取得了很大的成功,特别是在创建基类之间做出选择,或者改为采用共享行为并将其封装在对象中。继承可能会很快失控。

答案 1 :(得分:0)

在基类中,您可以将其设为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; }
}