2009-06-10 16 views
24

シナリオ: 私は基本クラス "MyBase"を持っています。 は、私は、カスタム属性「MyAttrib」私はこれを行うことでカスタム属性の強制使用

を持っている:

[MyAttrib(1234)] 
class MyClass : MyBase() 
{ 
MyClass() 
{ 
} 
} 

質問: 私はMyBaseからinhertingどのような方法力クラスで属性MyAttribを持っていることはできますか?

答えて

25

いいえ、コンパイラにC#で属性を要求する方法はありません。他にも利用可能なオプションがあります。アセンブリ内のすべての型を反映した単位テストを作成し、属性をチェックすることができます。しかし残念ながら、コンパイラに属性の使用を強制する方法はありません。

+0

以下の回答を@ frederik-gheyselsでご覧ください。 – devinbost

1

これにPostSharpを使用できます。 OnMethodInvocationAspectクラス(PostSharp)から属性クラスを継承し、CompileTimeValidateメソッドをオーバーライドします。

少し似ています。他の方法で回避(私は唯一の特定の属性が特定のインターフェイスを実装したクラスに適用することができることを望んでいた)にもかかわらず:クラスを継承するよう http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

2

私は、MyBaseクラスで抽象プロパティまたはメソッドを持っていた何をしましたかこのプロパティ/メソッドをオーバーライドして実装する必要があります。

属性はきれいではありませんが、実行時に私の意見で確認するよりも優れています。

+0

シナリオに合っていれば、これはもっとクリーンだと思います。 –

0

あなたは基本型またはインターフェイスのすべてのクラスが属性を持っていることを確認したい場合は、派生クラスの全てを取得し、それらは各々が属性を持って主張するシンプルなユニットテストを追加し、ユニットの結果を追加することができますあなたのさらなるビルドプロセスをテストしてください。