代码之家  ›  专栏  ›  技术社区  ›  MiffTheFox

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

  •  8
  • MiffTheFox  · 技术社区  · 15 年前

    我目前在system.windows.forms.control上有如下扩展方法:

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

    但是,此方法不会出现在从控件派生的类上,例如PictureBox。我是否可以生成一个扩展方法,它不仅出现在控件中,而且出现在从控件派生的类中,而不必执行显式转换?

    5 回复  |  直到 7 年前
        1
  •  15
  •   ShuggyCoUk    15 年前

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

    扩展方法在派生类型(例如,在 IEnumerable<T> 在system.linq中)。

        2
  •  8
  •   Nate Kohari    15 年前

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

        3
  •  2
  •   Maslow    15 年前

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

        4
  •  2
  •   Jon Barker    7 年前

    注释 如果从类中的属性调用扩展方法,而该属性继承自应用了扩展方法的基类,则必须在扩展方法的后缀中 this

    例如

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

    在哪里? GetValue 是我的扩展方法应用于基类。

        5
  •  -1
  •   Paul van Brenk    15 年前

    我认为您必须使扩展成为通用的:

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

    不,你不必……它还应该与您发布的非通用版本一起工作,请记住为扩展添加名称空间。