我目前在System.Windows.Forms.Control上有一个扩展方法,如下所示:
public static void ExampleMethod(this Control ctrl){ /* ... */ }
但是,此方法不会出现在从Control派生的类中,例如PictureBox。我是否可以创建一个不仅出现在Control中的扩展方法,而且还出现从Control派生的类,而不必进行显式转换?
答案 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
{ /* ... */ }
不,您不必...它也应该与您发布的非通用版本一起使用,请记住为您的扩展添加命名空间。