2015-12-27 5 views
9

私はそれが可能だとは思わないが、私はMSDNから明確な明確さを得ていないので、尋ねるのが最善だと思う。次のようなクラスがあるとします。部分クラスのプロパティに属性を追加することはできますか?

public partial class Hazaa 
{ 
    public int Shazoo { get; set; } 
} 

その後、私は別のファイルでそうしたいしかしとして起因するとShazooをしたいと思います。私は部分クラスを使用しているので、新しいプロパティを次のように追加できます。

public partial class Hazaa 
{ 
    [SuperCool] 
    public int Wheee { get; set; } 
} 

最初のサンプルで宣言されたプロパティは、後者にコードを記述することによって属性を付けることができますか?私はそれが可能だとは思わないが、私は訂正してうれしい。もしそうなら、構文は何ですか?

答えて

4

いいえ、できません。

属性は、そこに宣言したメンバーにのみアタッチすることができます。また、メンバーが部分的に宣言されていない限り、他の部分ファイルで宣言されたメンバーにアトリビュートを追加することはできません。あなたの要件に基づいて

+0

(1)ダーン...(2)部分**メンバー**?最初の部分は、あなたが確かに理解するように、自動生成されます。 **自動生成が変更されていない**私が制御しているファイルから部分的になるようにすることはできますか? (3)簡潔さのため+1。 –

+0

疑問点としては、部分的なメンバを実装するための特別な構文要件があります。たとえば、 'partial'キーワードを指定し、アクセス修飾子を指定しないようにします。 –

13

、あなたが使用することを検討することができ、オプションとして:

あなたがこの方法を登録できる属性が本当にあなたのクラス属性ではありませんが、ほとんどのフレームワークは使用それらはあなたのクラスネイティブ属性のようです。

データアノテーション属性を追加する場合は、特にASP.NET MVCプロジェクトとしてこの方法が役立ちます。

Windows Formsなどの他のフレームワークでは、MetadataTypeAttributeをサポートしていない場合は、単にAssociatedMetadataTypeTypeDescriptionProviderを使用してサポートを追加できます。

解決策はデータ注釈属性に限定されず、ライブラリとフレームワークにとって意味のあるすべての種類の属性を使用できます。

追加の属性を定義する方法は?

適切な属性で装飾された元のクラスのプロパティを含むメタデータクラスを作成し、MetadataType属性で部分クラスを修飾し、元のクラスのメタデータクラスを導入できます。

これらの属性の影響を確認するにはどうすればよいですか?

ASP.NET MVCなどのフレームワークは、元のクラスで定義されているような属性を使用します。

AssociatedMetadataTypeTypeDescriptionProviderまた、を、他のフレームワークまたはコンポーネントの元のタイプのプロバイダとして登録して、TypeDescriptorを使用して自分のタイプに関する情報を取得することもできます。

本当にクラス属性ですか。

、このように注意を払ってください、属性が本当にあなたの元のクラスに属していないが、ASP.NET MVCや種類に関する情報を取得するためにTypeDescriptorを使うWindows Formsなどのほとんどのフレームワーク、のために、彼らはあなたのクラス元の属性のように振る舞います。

リフレクションを使用してプロパティの属性を取得する場合は表示できませんが、TypeDescriptorメカニズムを使用している場合は、それらを参照できます。

アン例

Hazaaクラス:

public partial class Hazaa 
{ 
    public int Shazoo { get; set; } 
} 

HazaaMetadataクラス

[MetadataType(typeof(HazaaMetadata))] 
public partial class Hazaa 
{ 
} 

public class HazaaMetadata 
{ 
    [DisplayName("Shazoo Name")] 
    public int Shazoo { get; set; } 
} 

ASP.NET MVCの使用

あなたはそのDisplayName仕事をするために何もする必要はありません、あなたは単に影響を確認するためにHtml.LabelforまたはHtml.DisplayNameFormを使用することができます。ラベルテキストとして「Shazoo Name」が表示されます。

Windowsが使用

アプリケーション内のいくつかの場所(...、メイン、フォームのロードなど)プロバイダーをこのように登録フォーム:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa)); 
TypeDescriptor.AddProvider(provider, typeof(Hazaa)); 

、結果として、あなたが表示されますPropertyGridおよびDataGridViewは、プロパティおよび列タイトルのキャプションとして「Shazoo Name」を使用します。

+0

これは私の場合には役に立たないほど広すぎます。それにもかかわらず、それは興味深い貢献のようであり、実際にそれをテストしていないと、私はあなたの言葉をheheに持っています。野心的なアプローチのための+1、間違いなく! –

+0

ご意見ありがとうございます。このアプローチは、ASP.NET MVCやコード生成を使用するソリューションで頻繁に使用されています。このようにすると、クラス自体に触れることなく、特にメインクラスがツール(t4、ef、...)を使用して生成されている場合に、クラスにいくつかの属性を追加できます。 –

+0

それは?私は実際にはASP.NETを実際にやっているし、自動生成されたコードは素晴らしいとひどいです。おそらく私はあなたの提案をとにかく使ってしまうだろうが、人間であるため、私は私のために作られるべきもののほとんどを好む、hehe。 –

関連する問題