【问题标题】:C#: Adding extension methods to a base class so that they appear in derived classesC#:向基类添加扩展方法,以便它们出现在派生类中
【发布时间】:2010-11-16 02:22:02
【问题描述】:

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

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

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

【问题讨论】:

标签: c# extension-methods intellisense


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!它是在不同的命名空间中定义的,添加了一个 using 语句来修复它。
    • Namespace 和 Scope 在这里帮助我的关键字。谢谢!
    【解决方案3】:

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

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

    不,你不必......它也应该适用于你发布的非通用版本,记得为你的扩展添加命名空间。

    【讨论】:

    • 顶!!它就像一个魅力!当您必须返回类型 T 时,这是唯一有效的方法!谢谢 ! (public static T ExampleMethod...)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      例如

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

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

      【讨论】:

      • 我在方法中遇到了同样的问题。您的解决方案有效,谢谢!
      猜你喜欢
      • 2012-04-14
      • 2018-06-30
      • 2013-04-27
      • 1970-01-01
      • 2010-12-13
      • 2021-10-18
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多