1

これらのクラスがあるとしましょう

public class BaseClass
{
  public int Id { get; set; }
}

public class SomeClass : BaseClass
{
  ... more properties ...
}

BaseClass は多くの場所で使用されると考えられています。

私の場合、ASP.NET MVC 3 の EditorForModel を使用してビューをレンダリングしており、次のような属性でプロパティを装飾するのが一般的です。[Display(Name = "Id"), Required]

しかし、BaseClass を継承するクラスごとに異なる方法で BaseClass のプロパティを装飾したいとします。でSomeClass飾りたいかもしれませんId[Required]、でOtherClass飾りたいかもしれません[SomeCustomAttribute]

これに方法はありますか?

次のようなことができるとよいでしょう。

public class SomeClass : BaseClass
{
  public SomeClass()
  {
    WithProperty(x => x.Id).AddAttribute(new RequiredAttribute());
    ...
  }

  ... more properties ...
}
4

3 に答える 3

3

属性は静的メタデータです。アセンブリ、モジュール、型、メンバー、パラメーター、および戻り値は、C# のファースト クラス オブジェクトではありません (たとえば、System.Type クラスは単に型の反映された表現です)。タイプの属性のインスタンスを取得し、書き込み可能な場合はプロパティを変更できますが、タイプに適用されるため、属性には影響しません

于 2012-04-19T19:27:22.780 に答える
2

プロパティを仮想として宣言し、派生クラスでオーバーライドできます。クラス固有の属性でオーバーライドを装飾し、すべてのクラスに適用する必要がある属性で基本プロパティを装飾します。

基本プロパティに適用される属性自体がの値をAttributeUsageAttribute持つ で装飾されていないことを確認してください(デフォルトは です)。属性が指定する場合、オーバーライドするプロパティは属性を継承しません。詳細については、ドキュメントを参照してください。InheritedfalsetrueAttributeUsageInherited == false

于 2012-04-19T19:33:28.707 に答える
1

個々のオブジェクト インスタンス レベルのメンバーに属性を装飾することはできません。これはタイプ固有のメタデータです。これが本当に必要な場合は、インスタンス固有を扱う独自の属性管理を実装する必要があります。

于 2012-04-19T19:32:35.807 に答える