C#: добавление методов расширения в базовый класс, чтобы они отображались в производных классах
в настоящее время у меня есть метод расширения в системе.Окна.Формы.Контроль, как это:
public static void ExampleMethod(this Control ctrl){ /* ... */ }
однако этот метод не отображается в классах, производных от Control, таких как PictureBox. Могу ли я сделать метод расширения, который появляется не только в Control, но и для классов, производных от Control, без необходимости делать явное приведение?
5 ответов
необходимо включить оператор using для пространства имен, в котором определен класс extensions, или методы extension не будут находиться в области.
методы расширения отлично работают на производных типах (например, методы расширения, определенные на IEnumerable<T>
в систему.В LINQ).
метод расширения будет фактически применяться ко всем наследникам / исполнителям типа, который расширяется (в данном случае Control). Вы можете попробовать проверить операторы using, чтобы убедиться, что пространство имен, в котором находится метод расширения, ссылается там, где вы пытаетесь его вызвать.
вы также можете убедиться, что ваши расширения не определены в пространстве имен, тогда любой проект, который ссылается на них, автоматически импортирует их.
Примечание что если вы вызываете метод расширения из свойства в классе, который наследует от базового класса, к которому применяется метод расширения, вы должны суффиксировать метод расширения с this
например
public int Value
{
get => this.GetValue<int>(ValueProperty);
set => SetValue(ValueProperty, value);
}
здесь GetValue
мой метод расширения применяется к базовому классу.
Я думаю, вы должны сделать расширение общим:
public static void ExampleMethod<T>(this T ctrl)
where T : Control
{ /* ... */ }
нет, не надо.. он также должен работать с неродовой версией, которую вы опубликовали, не забудьте добавить пространство имен для своих расширений.