3


1

C#のカスタム属性:他のいくつかの属性を定義する属性を作成する方法は?

[名前]フィールドに次の属性を定義しました。

[Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(MyResources))]
[Display(Order = 0, Name = ResXStrings.UserName, ResourceType = typeof(MyResources))]
public string Name { get; set; }

次のようなカスタム属性を作成します。

[MyAttribute(DisplayName = "Username", ErrorMessage = "ValidationErrorRequiredField", ResourceType = typeof(MyResources))]
public string Name { get; set; }

これは、他の2つの(Required_および_Display)属性をコードで定義します。

これを実装する方法は?

*更新*それは不可能です。 私の質問に答えてくれたすべての人に感謝します。

4 Answer


2


あなたはこれを行うことができないだろうと確信しています。 問題は、属性が型、メソッド、プロパティなどに付加されたほんの少しのメタデータであるということです。 それ自体は何もしません。

メタデータをどのように処理し、どのように処理するかを決定するのは、メタデータを消費しているコード次第です。

属性に何らかの機能コード(http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute%28v=VS.90%29.aspx[System.Web。 Mvc.ActionFilterAttribute])、それはそれを呼び出す属性です。

つまり、目的を達成するには、属性のコンシューマーを変更して、新しい属性を理解する必要があります。


2


私はあなたができるとは思わない。 属性の消費者はタイプによってそれらを見つけることが多いため、新しい属性はRequiredAttributeとDisplayAttributeである必要があります。 C#は多重継承をサポートしていないため、このようなクラスを作成する方法はありません。


1


カスタム属性を使用してこれを行う方法があります。 http://msdn.microsoft.com/en-us/library/system.componentmodel.icustomtypedescriptor.aspx [ICustomTypeDescriptor]を実装して、必要な属性を追加してみることはできますが、どのシナリオでもサポートされているとは思えません。


0


これは*直接*可能ではありませんが、アプリケーションの設計を*微調整することでそれを行うことができるかもしれませんが、そうすることをお勧めしません* 2つの異なる責任を同じクラスに入れます。

_ 覚えておいてください、クラスには常に変更する1つの理由が必要です。 _