переопределить метаданные в статическом конструкторе? - PullRequest
8 голосов
/ 22 марта 2011

У меня есть класс, который наследует класс 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"]));
    }
}

сейчас я очень доволен этим, но Microsoft - нет. А именно, когда я использую функцию анализа кода, я получаю это:

CA1810: Инициализировать статические поля ссылочного типа inline

Отсюда мой вопрос: что я могу с этим поделать?

  • игнорировать предупреждение? >> Я не люблю игнорировать предупреждения
  • переместить вызов в метод overrideMetadata? >> Я бы хотел, но где?

любые советы приветствуются, спасибо

Редактировать: Я добавлю, что я не до конца понимаю, почему я получаю это предупреждение, так как я не инициализирую что-либо, скажем, в моем статическом конструкторе, или я?

1 Ответ

10 голосов
/ 22 марта 2011

Вот ссылка из MSDN для переопределения метаданных для переопределения метаданных для свойства зависимости :

В нем говорится: «Переопределение метаданных в свойстве зависимости должно быть выполнено до того, как это свойство будет использовано системой свойств (это соответствует времени, когда создаются конкретные экземпляры объектов, которые регистрируют свойство). Вызовы OverrideMetadata должны выполняться внутри статического объекта. конструкторы типа, который предоставляет себя в качестве параметра forType для OverrideMetadata. "

И формулировка из ссылки, которую вы разместили на CA1810 о том, когда следует подавлять предупреждения:

Когда следует подавлять предупреждения

CA1810 Можно безопасно исключить предупреждение из этого правила, если производительность не является проблемой; или если глобальные изменения состояния, вызванные статической инициализацией, являются дорогостоящими или должны гарантированно произойти до вызова статического метода типа или создания экземпляра типа.

Итак, ваша текущая реализация и подавление предупреждения, вероятно, является правильным маршрутом.

...