8

クラスを継承するTextBoxクラスがあり、それを呼び出しますMyTextBox

Backgroundこのクラスのデフォルト値を再定義したいと思います。

そこで私はそうする方法を探し、良い選択肢を見つけました: callBackgroundProperty.OverrideMetadata()

問題は:これをどこに置くことができますか?

App.OnStartup()?醜くて実用的ではないので、それをクラスのコード ファイルに含めたいと思います。

クラスのコンストラクターで?例外があります:

PropertyMetadata は、タイプ 'MyTextBox' に対して既に登録されています。

(私には問題ないように思えます。これを完全に取得する理由を理解しています)

そこで、C# の静的コンストラクターについてもう一度調べてみました (以前はそれについて何も知りませんでした。残念です)。

ここに私のコードがあります:

public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(App.Current.Resources["CustomBackgroundBrush"]));
    }
}

今、私はこれにかなり満足していますが、マイクロソフトはそうではありません. つまり、コード分析機能を使用すると、次のようになります。

CA1810:参照型の静的フィールドをインラインで初期化します

したがって、私の質問:それについて何ができますか?

  • 警告を無視しますか?>> 警告を無視したくない
  • overrideMetadata メソッドへの呼び出しを移動しますか? >> したいのですが、どこですか?

どんなヒントでも歓迎します、ありがとう

編集:静的コンストラクターで言うごとに何も初期化していないため、この警告が表示される理由を完全には理解していないことを追加しますか?

4

1 に答える 1

10

依存関係プロパティのメタデータをオーバーライドするためのメタデータをオーバーライドするための MSDN からのリンクは次のとおりです。

「依存関係プロパティのメタデータのオーバーライドは、そのプロパティがプロパティ システムによって使用される前に行う必要があります (これは、プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化される時間に相当します)。OverrideMetadata の呼び出しを実行する必要があります。 OverrideMetadata の forType パラメータとして自身を提供する型の静的コンストラクタ内。"

そして、警告をいつ抑制するかについて CA1810 に投稿したリンクからの文言:

警告を抑制する場合

CA1810 パフォーマンスが問題にならない場合は、このルールからの警告を抑制しても安全です。または、静的初期化によって引き起こされるグローバル状態の変更が高価であるか、型の静的メソッドが呼び出される前、または型のインスタンスが作成される前に発生することを保証する必要がある場合。

したがって、現在の実装と警告の抑制はおそらく正しいルートです。

于 2011-03-22T15:24:44.500 に答える