静的コンストラクターのメタデータをオーバーライドしますか?
-
28-10-2019 - |
質問
継承するクラスがあります TextBox
クラス、それを呼んでください MyTextBox
デフォルトを再定義したいのですが Background
このクラスの価値。
だから私はそうする方法を探して、良いオプションを見つけました:電話 BackgroundProperty.OverrideMetadata()
トラブルは:これをどこに置くことができますか?
の中に App.OnStartup()
?醜くて実用的ではないので、クラスのコードファイルに入ってほしいと思います。
クラスのコントルクターで?例外が得られます:
PropertyMetadataは、型「myTextbox」に既に登録されています。
(私には大丈夫そうです、私はなぜ私がこれを完璧に手に入れるのか理解しています)
だから私は再びC#の静的コンストラクターについて発見されました(それについて以前はそうではありませんでした、なんて残念です)
これが私のコードです:
public class MyTextBox : TextBox
{
static MyTextBox()
{
MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(App.Current.Resources["CustomBackgroundBrush"]));
}
}
今、私はこれがかなり幸せですが、マイクロソフトはそうではありません。つまり、コード分析機能を使用すると、これを取得します。
したがって、私の質問:私はそれについて何ができますか?
- 警告を無視しますか? >>警告を無視したくない
- CallをOverDemetadataメソッドに移動しますか? >>私はしたいのですが、どこ?
ヒントを歓迎します、ありがとう
編集: 静的コンストラクターで発言されたものを初期化していないので、なぜこの警告を受けたのか完全には理解できないと付け加えますか?
解決
メタデータをオーバーリッディングするためのMSDNからのリンクは次のとおりです 依存関係プロパティのメタデータをオーバードイングします:
「依存関係プロパティのメタデータをオーバーライドする前に、プロパティシステムによって使用される前に行う必要があります(プロパティを登録するオブジェクトの特定のインスタンスがインスタンス化される時間に相当)。 OverrideMetadataのFortypeパラメーターとしてそれ自体を提供するタイプの静的コンストラクター内。」
そして、あなたがCA1810に投稿したリンクからの言葉遣いは、警告を抑制する時期について:
警告を抑制するタイミング
CA1810パフォーマンスが懸念されない場合、このルールからの警告を抑制することは安全です。または、静的初期化によって引き起こされるグローバル状態の変更が高価であるか、タイプの静的方法が呼び出されるか、型のインスタンスが作成される前に発生することを保証する必要があります。
したがって、警告の現在の実装と抑制は、おそらく正しいルートです。