【问题标题】:Attribute on Interface members does not work接口成员的属性不起作用
【发布时间】:2012-08-24 09:24:12
【问题描述】:

在我的应用程序中,多个模型需要Password 属性(例如,RegistrationChangePassword 模型)。 Password 属性具有 DataTypeRequired 之类的属性。因此,为了确保可重用性和一致性,我创建了:

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

class RegistrationModel : IPasswordContainer {
    public string Password { get; set; }
}

很遗憾,属性不起作用。

然后我尝试将接口更改为类:

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

现在它正在工作。为什么会这样?

为什么属性从类继承时有效,而从接口继承时无效?

【问题讨论】:

标签: c# interface annotations attributes


【解决方案1】:

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

找到answer from Microsoft

产品团队不想实现这个功能,主要是因为两个 原因:

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

【讨论】:

  • 虽然部分理解,但非常令人失望。什么对我没有意义:为什么多重继承应该是属性属性而不是方法属性的问题?又为什么语言设计要受到某种基于语言的框架如ASP.Net MVC的影响?
  • 这又是有道理的,因为属性添加了行为,而接口不应该定义行为。实现接口的类应该这样做。
  • @chiccodoro 他们没有定义行为。他们提供元信息。如果没有附加代码,属性本身将不起作用,因此不定义行为。我们不要为这个功能不存在找借口。
  • @AndreasMüller(恭敬地)不同意 - 属性定义了一种行为模式,而不是行为的实现。
  • @CADbloke 不一定没有。让我们以 DebuggerDisplayAttribute 为例。它的目的就是向该属性的消费者提供元数据。没有消费者就没有行为。事实上,你可以自己消费它并做一些完全不同的事情。因此属性不定义行为 - 大多数时候它是属性的消费者(取决于您如何解决问题)
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多