C# 接口成员上的属性无效
在我的应用程序中,有几个型号需要C# 接口成员上的属性无效,c#,interface,annotations,attributes,C#,Interface,Annotations,Attributes,在我的应用程序中,有几个型号需要密码属性(例如,注册和更改密码型号)。Password属性具有类似于DataType和Required的属性。因此,为了确保可重用性的一致性,我创建了: interface IPasswordContainer{ [Required(ErrorMessage = "Please specify your password")] [DataType(DataType.Password)] string Password { get; set;
密码
属性(例如,注册
和更改密码
型号)。Password
属性具有类似于DataType
和Required
的属性。因此,为了确保可重用性的一致性,我创建了:
interface IPasswordContainer{
[Required(ErrorMessage = "Please specify your password")]
[DataType(DataType.Password)]
string Password { get; set; }
}
及
不幸的是,这些属性不起作用
然后我尝试将接口更改为类:
public class PasswordContainer {
[Required(ErrorMessage = "Please specify your password")]
[DataType(DataType.Password)]
public virtual string Password { get; set; }
}
及
现在它正在工作。为什么会这样
为什么从类继承时属性有效,而从接口继承时属性无效?接口属性的属性不会继承到类,您可以将接口设置为抽象类 找到一个: 产品团队不希望实现此功能,原因有两个 原因:
- 与DataAnnotations.Validator的一致性
- 与ASP.NETMVC中验证行为的一致性
- 棘手的场景:一个类实现两个具有相同属性但属性冲突的接口。哪个 属性优先
也usefull@KyorCode:搜索时,我找不到您在第一条评论中发布的问题。甚至不在相关问题列表中。我已经将这个问题标记为与你提出的问题完全相同的问题。虽然部分理解,但它相当令人失望。什么对我来说没有意义:为什么多重继承应该是属性属性的问题而不是方法属性的问题?为什么语言设计应该受到某种框架的影响,比如基于该语言的ASP.NETMVC呢?反过来,它是有意义的,因为属性添加了行为,而接口不应该定义行为。实现接口的类应该这样做。@chiccodoro他们没有定义行为。它们提供元信息。属性本身在没有附加代码的情况下不会产生任何效果,因此不会定义行为。我们不要为这个功能不存在找借口。@AndreasMüller(恭敬地)不同意-属性定义了一个行为模式,而不是行为的实现。@Cadblock不一定是。让我们以DebuggerDisplayAttribute为例。它的目的只是向该属性的使用者提供元数据。没有消费者,就没有任何行为。事实上,你可以自己消费,做一些完全不同的事情。因此属性并不定义行为——大多数情况下,属性的使用者(取决于您如何解决问题)
public class PasswordContainer {
[Required(ErrorMessage = "Please specify your password")]
[DataType(DataType.Password)]
public virtual string Password { get; set; }
}
public class RegistrationModel : PasswordContainer {
public override string Password { get; set; }
}