C#:将扩展方法添加到基类,以便它们出现在派生类中

时间:2009-08-01 22:06:43

标签: c# extension-methods intellisense

我目前在System.Windows.Forms.Control上有一个扩展方法,如下所示:

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

但是,此方法不会出现在从Control派生的类中,例如PictureBox。我是否可以创建一个不仅出现在Control中的扩展方法,而且还出现从Control派生的类,而不必进行显式转换?

5 个答案:

答案 0 :(得分:15)

您必须为定义扩展类的命名空间包含using语句,否则扩展方法将不在范围内。

扩展方法适用于派生类型(例如,System.Linq中IEnumerable<T>上定义的扩展方法)。

答案 1 :(得分:8)

扩展方法实际上将应用于正在扩展的类型的所有继承者/实现者(在本例中为Control)。您可以尝试检查using语句,以确保在您尝试调用它的位置引用扩展方法所在的命名空间。

答案 2 :(得分:3)

注意如果从类中的属性调用扩展方法,该类继承自应用了扩展方法的基类,则必须使用{{1}后缀扩展方法}

e.g。

this

public int Value { get => this.GetValue<int>(ValueProperty); set => SetValue(ValueProperty, value); } 是我的扩展方法应用于基类的地方。

答案 3 :(得分:2)

您还可以确保未在命名空间中定义扩展,然后引用它们的任何项目都会自动导入它们。

答案 4 :(得分:-1)

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

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

不,您不必...它也应该与您发布的非通用版本一起使用,请记住为您的扩展添加命名空间。