8

OK、この種は私の前の質問に続くものです。

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

明確にするためにF6(ビルド)プレスでビルドを中断したくないので、属性で装飾されたメソッドがコード内の別の場所で呼び出された場合にのみビルドを中断したいと思います。私が言ったように、時代遅れに似ていますが、同じではありません。

他のユーザーが他の理由でそれを使用したいので、私はこれで一人ではないことを知っています。これまでカスタム属性を作成したことがないので、まったく新しいものです。

4

11 に答える 11

5

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

于 2008-09-04T13:21:28.887 に答える
4

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

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

編集:おそらくより深い質問に答えるために、コンパイラは3つの属性(廃止、条件付き、およびAttributeUsage)についてのみ知っています。他の属性に特別な処理を追加するには、コンパイラーを変更する必要があります。

于 2008-08-26T14:36:30.933 に答える
3

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

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

于 2008-08-26T14:19:36.260 に答える
1

唯一の確実な方法は、Visual Studio を (VSIP を介して) 拡張し、正しいイベント (おそらく EnvDTE.BuildEvents 内) クラスにサブスクライブし、コンストラクターの使用についてコードをチェックし、ビルドをキャンセルすることだと思います。それを検出します。

于 2008-08-26T22:26:13.643 に答える
0

これはすべて、昨日のTDWTFのように聞こえ始めています。:-)

于 2008-08-26T14:16:26.363 に答える
0

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

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

于 2008-08-26T14:32:44.450 に答える
0

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

作業を行う可能性のある別のかなり未知の属性は、条件付き属性です(何を達成しようとしているかによって異なります)。

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

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

于 2008-08-26T14:46:13.217 に答える
0

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

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

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

于 2008-08-26T14:51:54.343 に答える
0

4年後の対応:)

Obsoleteに代わるものがあるかどうか、同じ質問がありました。

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

あなたがそれについて考えるとき、それは実際にはかなりクールでしょう。また、MS が取り組んでいるコンパイラ API の進捗状況についても調べてみる必要があることを思い出させてくれます...

于 2012-08-08T03:00:43.833 に答える
0

ビルド後のステップとして、カスタム例外と単体テストをスローします

于 2012-06-07T10:52:42.390 に答える
-2

何かを作ってみませんか?未知の属性は確かにビルドを壊します。

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
于 2008-08-26T14:28:08.580 に答える