Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口成员上的属性无效_C#_Interface_Annotations_Attributes - Fatal编程技术网

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