2008-08-26 10 views
6

これは、my previous questionから続くものです。ビルドを中断する属性を作成する

私が実際にやってみたいのは、のビルドを中断するメソッドをデコレートする属性を作成することです。 廃止( "理由"、真)属性とよく似ていますが、廃止されたコードを誤って特定することはありません。

を明確にする:私はそれがANY F6(ビルド)を押し、私は唯一の属性で修飾方法は、コードのどこかで呼び出された場合、それは、ビルドを壊したく上でビルドを壊したくいけません。私が言ったように、同様のは時代遅れですが、同じではありません。

other users want to use it for other reasons以降、私はこれだけではないことを知っています。私はカスタム属性を作成していないので、それは私には全く新しいものです!

答えて

5

これは、XMLシリアライゼーションとNHibernateの場合(参照したexampleの場合のように)、パラメータのないコンストラクタにアクセスできるようにするために、プライベートまたは保護されたパラメータのないコンストラクタをシリアル化に使用するか、 NHibernate。保護されたバージョンでは、継承したクラスがそのコードを呼び出せるように自分自身を開きます。

メソッドを呼び出すコードが必要ない場合は、メソッドにアクセスできないようにしてください。

EDIT:おそらく深い疑問に答えるために、AFAIKコンパイラは約3つの属性、つまりObsolete, Conditional, and AttributeUsageしか知りません。他の属性に対して特別な処理を追加するには、コンパイラーを変更する必要があります。

+0

Googleで掘り下げた後、Obsoleteのビルド・アビリティ実際にはコードマジックではなくコンパイラマジックです!くそー! –

4

ビルド・ブレイク([Obsolete]がスローするもの)の警告を考慮する場合は、#warningコンパイラ・ディレクティブを使用してください。

編集:これまで使ったことはありませんが、#errorも利用できます。

-1

何かを作るだけではないのはなぜですか?未知の属性があればビルドが確実に壊れてしまいます。

[MyMadeUpAttributeThatBreaksTheBuildForSure] 
public class NotDoneYet {} 
0

私はグレッグに同意する必要があります:その属性を構成します。

本当に深刻な場合は、コンストラクタがXMLSerializer以外のものによってアクセスされているかどうかを判断し、例外があればそれをスローします。

0

#errorディレクティブを使用することをお勧めします。

作業を行う可能性があります別のかなり未知の属性が「MY_CONDITION」の場合ILコード自体からのメソッド呼び出しを削除します(あなたがahieveしようとしているものに応じて)conditional attribute

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg) 

です定義された。

0

FxCopルールを作成し、これを確認するためにFxCopを統合ビルドに追加します。

失敗したビルドではなく、警告が表示されます。属性は、ビルド時間ではなくリフレクション時に「実行」されます。

また、(これはむしろ面倒ですが)呼びたくないメソッドの周りにコンパイラ指令を置きます。あなたがそれを呼び出すと、あなたのコードは壊れますが、適切なコンパイラ指令を渡すビルドをセットアップできます。

1

Visual Studioを(VSIP経由で)拡張し、正しいイベント(おそらくEnvDTE.BuildEventsクラス)​​に登録し、コンストラクタの使用方法をコードで確認してキャンセルするだけだと思います。あなたがそれを検出したらビルドします。

5

これはマイクロソフトにとって優れた機能要求であると考えています。コンパイラが何らかの方法で処理する、またはコンパイルプロセスに影響する抽象基本クラス属性CompilerExecutedAttributeを作成します。次に、この属性を継承してさまざまな操作を実装できます(例:エラーまたは警告を出します。

1

4年後の対応ポストビルドステップとして

0

をそれのためのカスタム例外とユニットテストを投げる:)

廃止の代替があった場合、私は同じ質問がありました。

私は少し前に思い出したことから、マイクロソフトは、devsにある時点でコンパイラAPIのようなものにアクセスできるようにしていると述べているので、将来コンパイラの "プラグイン"あなた自身のカスタム属性を使ってメソッドをデコレートし、デコレートされたコードがコード内の他の場所で呼び出されるようになったら、コンパイラにキャンセルするように指示します。

あなたが考えると、それについて。また、私は、MSが作業しているコンパイラAPIの進捗状況についても試してみる必要があることを覚えておいてください。

関連する問題