2012-08-24 6 views
17

私のアプリケーションでは、いくつかのモデルにはPasswordのプロパティ(たとえば、RegistrationChangePasswordモデル)が必要です。 Passwordプロパティの属性は、DataTypeおよびRequiredです。したがって、再利用性の一貫性を確保するために、私が作成した:インターフェイスメンバーの属性が機能しません

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

今、それが働いています。それはなぜそうですか?

属性がクラスから継承されても、インターフェイスから継承されても機能しないのはなぜですか?

+0

http://stackoverflow.com/questions/540749/can-ac-sharp-class-inherit-attributes-from-its-interface – KyorCode

+0

http://bradwilson.typepad.com/blog/2011 /08/interface-attributes-class-attributes.html便利である – KyorCode

+0

@KyorCode:検索中に最初のコメントに投稿した質問を見つけることができませんでした。関連する質問のリストにも含まれていません。私はあなたが審査した質問の正確な重複としてこの質問をマークしました。 – Mohayemin

答えて

20

インターフェイスプロパティの属性がクラスに継承されない場合は、インターフェイスを抽象クラスにすることができます。 DataAnnotations.Validatorにおける検証動作と

  • 一貫性を持つ

    • 一貫性:

      製品チームは、2つの主要な の理由から、この機能を実装する必要はありません:answer from Microsoft見つかり

      ASP.Net MVC

    • トリッキーなシナリオ:クラスは、同じプロパティを持つ2つのインターフェイスを実装していますが、コンフリクトがありますそれらに属性を付ける。どの 属性が優先されますか?
  • +3

    部分的には分かっていますが、かなり残念です。なぜ私には意味がないのですか:複数の継承をプロパティ属性ではなく、メソッド属性では問題にする必要があるのはなぜですか?そして、言語に基づいているASP.Net MVCのような特定のフレームワークの影響を受けるのはなぜですか? – chiccodoro

    +10

    属性は振る舞いを追加し、インターフェイスは振る舞いを定義するものではないため、意味を成しています。インタフェースを実装しているクラスはそうしています。 – chiccodoro

    +7

    @chiccodoro彼らは行動を定義していません。メタ情報を提供します。属性自体は追加コードなしでは効果がなく、したがって動作を定義しません。この機能が存在しないという言い訳をしません。 – Dbl

    関連する問題