質問

OK、これは次のようなものです 私の前の質問.

私が本当にやりたいのは、メソッドを装飾できるようにするある種の属性を作成することです。 ビルドを壊す. 。とよく似ています 廃止された("理由", true) ただし、古いコードを誤って識別することはありません。

明確にするために:ビルドを壊したくない どれでも F6 (ビルド) を押します。この属性で修飾されたメソッドがコード内の別の場所で呼び出された場合にのみビルドを中断したいと考えています。先ほども言ったように、 似ている 時代遅れになりますが、同じではありません。

これに悩んでいるのは私だけではないことはわかっています。 他のユーザーは別の理由でそれを使用したいと考えています. 。これまでカスタム属性を作成したことがなかったので、すべてが初めてでした。

役に立ちましたか?

解決

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

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

編集:より深い質問に答えるために、私の知る限り、コンパイラーは次の 3 つの属性しか知りません。 廃止された、条件付き、および属性の使用法. 。他の属性に特別な処理を追加するには、コンパイラを変更する必要があります。

他のヒント

これは Microsoft にとって素晴らしい機能リクエストだと思います。抽象基本クラス属性を作成する CompilerExecutedAttribute コンパイラが何らかの方法で処理するもの、またはコンパイル プロセスに影響を与える可能性のあるもの。次に、この属性を継承して、さまざまな操作を実装できます。エラーまたは警告を発します。

警告 ([Obsolete] がスローするもの) がビルドを破壊すると考えられる場合は、単に #警告 コンパイラディレクティブ。

編集:使ったことないけど、 #エラー も利用可能です。

唯一の絶対確実な方法は、Visual Studio を (VSIP 経由で) 拡張し、正しいイベント (おそらく EnvDTE.BuildEvents 内) クラスをサブスクライブし、コードでコンストラクターの使用状況を確認し、問題がある場合はビルドをキャンセルすることだと思います。それを検出します。

これはすべて少し似ているように聞こえ始めています 昨日のTDWTF. :-)

私もグレッグの意見に同意せざるを得ません。それの属性を作成します。

そして、本当に真剣であれば、コンストラクターが XMLSerializer 以外によってアクセスされているかどうかを確認し、アクセスされている場合は例外をスローする方法を見つけるかもしれません。

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

機能するかもしれないもう 1 つのかなり未知の属性は、 条件属性 (何を達成しようとしているかによって異なります)

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

これにより、「MY_CONDITION」が定義されている場合、IL コード自体からメソッド呼び出しが削除されます。

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

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

あるいは (これはかなり厄介ですが)、呼び出されたくないメソッドの周囲にコンパイラ ディレクティブを置きます。その場合、コードを呼び出すとコードが壊れますが、適切なコンパイラ ディレクティブをパスするビルドとパスしないビルドをセットアップできます。

ビルド後のステップとしてカスタム例外をスローし、それに対する単体テストを実行します。

4年後に返信:)

Obsolete の代替手段があるかどうかについても同じ質問がありました。

少し前に私が思い出したこと (channel9 のビデオ) によると、Microsoft は、開発者がコンパイラ API のようなものにアクセスできるように取り組んでいると述べたので、将来的には、次のことを可能にするコンパイラ「プラグイン」を作成できる可能性があると考えられます。独自のカスタム属性でメソッドを装飾し、装飾されたコードがコード内の他の場所で呼び出されそうな場合にキャンセルするようにコンパイラーに指示します。

実際に考えてみると、これはかなり素晴らしいことでしょう。また、MS が取り組んでいるコンパイラ API の進捗状況についても読んでみる必要があることも思い出しました...

何かをでっちあげてみませんか?不明な属性はビルドを確実に破壊します。

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top