接口成员的属性不起作用

Moh*_*min 18 c# attributes annotations interface

在我的应用程序中,有几个模型需要Password属性(例如RegistrationChangePassword模型).该Password物业具有DataType和的属性Required.因此,为了确保可重用性的一致性,我创建了:

interface IPasswordContainer{
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    string Password { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

class RegistrationModel : IPasswordContainer {
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,属性不起作用.

然后我尝试将界面更改为类:

public class PasswordContainer {
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    public virtual string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public class RegistrationModel : PasswordContainer {
    public override string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在它正在运作.为什么会这样?

为什么属性在从类继承时工作但在从接口继承时不工作?

Hab*_*bib 25

接口属性上的属性不会继承到类,您可以将接口设置为抽象类.

从微软找到答案:

产品团队不希望实现此功能,原因有两个:

  • 与DataAnnotations.Validator的一致性
  • 与ASP.Net MVC中的验证行为保持一致
  • 棘手的场景:一个类实现两个具有相同属性的接口,但它们具有冲突的属性.哪个属性优先?

  • 反过来,它确实有意义,因为属性添加了行为,接口不应该定义行为.实现接口的类应该这样做. (10认同)
  • @chiccodoro他们没有定义行为.他们提供元信息.如果没有附加代码,属性本身将无效,因此不会定义行为.让我们不要为这个不存在的功能找借口. (8认同)
  • 虽然部分理解,但令人非常失望.什么对我没有意义:为什么多重继承是属性属性的问题而不是方法属性?为什么语言设计会受到某种框架的影响,例如基于语言的ASP.Net MVC? (3认同)