C #: добавление методов расширения в базовый класс, чтобы они появлялись в производных классах - PullRequest
8 голосов
/ 02 августа 2009

В настоящее время у меня есть метод расширения для System.Windows.Forms.Control, например:

public static void ExampleMethod(this Control ctrl){ /* ... */ }

Однако этот метод не отображается в классах, производных от Control, таких как PictureBox. Могу ли я создать метод расширения, который появляется не только в Control, но и для классов, производных от Control, без необходимости явного приведения?

Ответы [ 5 ]

15 голосов
/ 02 августа 2009

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

Методы расширения работают нормально на производных типах (например, методы расширения, определенные в IEnumerable<T> в System.Linq).

8 голосов
/ 02 августа 2009

Метод расширения будет фактически применяться ко всем наследникам / разработчикам типа, который расширяется (в данном случае, Control). Вы можете попробовать проверить свои операторы using, чтобы убедиться, что к пространству имен, в котором находится метод расширения, ссылаются там, где вы пытаетесь его вызвать.

3 голосов
/ 28 июля 2017

Обратите внимание , что если вы вызываете метод расширения из свойства в классе, которое наследуется от базового класса, к которому применен метод расширения, вы должны суффиксировать метод расширения с this

, например

public int Value
{
    get => this.GetValue<int>(ValueProperty);
    set => SetValue(ValueProperty, value);
}

Где GetValue - это мой метод расширения, примененный к базовому классу.

2 голосов
/ 13 сентября 2009

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

0 голосов
/ 02 августа 2009

Я думаю, вы должны сделать расширение универсальным:

public static void ExampleMethod<T>(this T ctrl)
    where T : Control 
{ /* ... */ }

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

...