2009-04-21 8 views
2

属性が特定のクラスに適用されるプロパティの数を制限することはできますか?C#属性の制限

+1

いいえ、なぜこれをやりたいですか? –

答えて

3

コンパイル時に、

実行時に、この不変量に​​違反するとスローする静的な初期化子でこれを検証できますが、これは非常に貧弱なスタイルと見なされますが、不変量が保持されないコードは実行できないという意味で安全です。

コンパイルのDLL Aをクラス

でA.DLLを参照

public class Foo 
{ 
    public int Property1 {get;} 
} 

コンパイルのDLL Bで:あなたはあなたが想像コンパイル時にこれを確認することができても、ネットに固有の拡張性を考える場合

public class Bar 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property2 {get;} 
} 

、あなたは

public class Foo 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property1 {get;} 
} 
01とA.DLLを再コンパイル

と古いB.DLLで、この新しいA.DLLを実行しよう(彼らは他のすべての点でバイナリ互換性があるので、これは結構です)

明らかにランタイムがこれをチェックするかなりの努力の正気をしなければならないでしょう、ではありません言い換えれば、Bは突然AとBのどちらか一方または両方を不法にすることがあります。

したがって、この機能はフレームワークで利用できるとは思わないはずです。それが重要な場合

1

コンパイル時には考えられません。しかし、インスタンスコンストラクタや実行時にリフレクションを介してこれをチェックする静的コンストラクタにコードを追加することもできます。

1

中(または直後)コンパイル時、あなたはFxCopルールまたはあなたの属性([OnlyOnceAttribute]のような模様)のカスタム検索を作成する必要があります。

findstr "[OnlyOnceAttribute]" *.cs 

FINDSTRユーティリティは、一致した行を返します。行数をキャッチするバッチファイルだけが必要で、get backは呼び出し元(= MSBuildタスク)にエラーが発生し、ビルドに失敗します。

+0

良いアイデアだが、部分的なクラスと継承がこれを覆し、ファイル内の複数のクラスが偽陽性の原因になることに注意してください。 コンパイルされたフォームの総コードベースにアクセスできる限り、適切なFxCopルールに進むことができます。 – ShuggyCoUk