在静态构造函数中覆盖元数据?

8
我有一个类,继承了TextBox类,称其为MyTextBox
我想重新定义此类的默认Background值。
所以我寻找一种方法来实现这个目标,找到了一个好的选项:调用BackgroundProperty.OverrideMetadata()
问题是:我应该把它放在哪里?
放在App.OnStartup()中?这样不太美观且不切实际,我希望它在我的类代码文件中。
放在类的构造函数中?我会收到异常:

PropertyMetadata is already registered for the type 'MyTextBox'.

(在我的理解中没问题,我明白为什么会出现这个异常)
因此,我再次查找并发现C#中有静态构造函数(之前不知道,真可惜)。
下面是我的代码:
public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(App.Current.Resources["CustomBackgroundBrush"]));
    }
}

现在我对此感到非常满意,但是微软不是这样的。具体而言,当我使用代码分析功能时,我会得到以下提示:

CA1810:应该内联初始化引用类型的静态字段

因此我的问题是:我该怎么办?

  • 忽略警告吗? >> 我不喜欢忽略警告
  • 将overrideMetadata方法调用移到哪里呢? >> 我想移动,但是移到哪里呢?

欢迎任何提示,谢谢。

编辑:我会补充说我不完全理解为什么我会收到这个警告,因为我在静态构造函数中没有初始化任何东西,或者说我吗?

1个回答

10

以下是MSDN提供的关于重写依赖属性元数据的链接:overridding metadata for a dependency property

它阐述了: "必须在依赖属性被属性系统使用之前(这相当于注册该属性的对象的特定实例被实例化的时间),对依赖属性上的元数据进行重写。对OverrideMetadata的调用必须在提供其自身作为forType参数的类型的静态构造函数中执行。"

此外,你所贴出的关于何时抑制警告的CA1810的措辞如下:

何时抑制警告

CA1810 如果性能问题不是问题;或静态初始化引起的全局状态更改很昂贵或必须保证在调用类型的静态方法或创建类型的实例之前发生,则可以安全地忽略来自此规则的警告。

因此,你当前的实现和警告抑制可能是正确的路线。


+1 对于msdn链接。不知怎么的,它比我找到的那个更完整。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接