2009-08-01 143 views
6

我目前有这样上System.Windows.Forms.Control的扩展方法:C#:添加扩展方法的基类,使得它们出现在派生类

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

然而,这种方法不出现在从Control派生的类上,如PictureBox。我可以做一个扩展方法,不仅出现在Control中,而且用于派生自Control的类,而不必进行明确的转换?

+0

[为什么我无法从扩展类型的基类调用扩展方法?](http://stackoverflow.com/questions/27883427/why-cant-i-call-an-扩展方法从基类扩展类型) – 2016-11-29 11:31:43

回答

13

您必须在定义扩展类的名称空间中包含using语句,否则扩展方法将不在作用域中。

扩展方法在派生类型上工作正常(例如,在System.Linq中的IEnumerable<T>上定义的扩展方法)。

+0

谢谢!它是在一个不同的命名空间中定义的,添加一个using语句修复了它。 – MiffTheFox 2009-08-01 23:18:56

8

扩展方法实际上将应用于扩展类型的所有继承者/实现者(在本例中为Control)。您可能会尝试检查您的使用语句,以确保扩展方法所在的名称空间在您要调用的名称空间中被引用。

-2

我认为你必须使扩展通用:

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

不,你不必..它还应与您发布的非通用版本的工作,记得要加的命名空间你的扩展。

1

您还可以确保您的扩展没有在名称空间中定义,那么任何引用它们的项目都会自动导入它们。

0

注意如果调用从类由具有施加到其上的扩展方法的基类继承的属性的扩展方法,你有this

例如到后缀扩展方法

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

其中GetValue是我的扩展方法应用于基类。

相关问题