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 
{ /* ... */ }

нет, не надо.. он также должен работать с неродовой версией, которую вы опубликовали, не забудьте добавить пространство имен для своих расширений.