从派生类内部调用C#基类扩展方法?

时间:2011-06-06 16:58:37

标签: c# extension-methods

这是一个人为的例子:

public static class MyExtensions
{
  public static void MyMethod( this MyInterface obj, string txt )
  {
  }
}

interface MyInterface {}

public MyDerived : MyInterface
{
  void DoStuff()
  {
    MyMethod( "test" ); // fails; compiler can't find MyMethod?
  }
}

在上面的例子中,我试图调用从派生类分配给接口的扩展方法。编译器在这里失败,并说MyMethod在当前上下文中不存在。我在我的CS文件中有所有适当的使用语句,所以我不确定发生了什么。

4 个答案:

答案 0 :(得分:18)

尝试像this

一样调用它
this.MyMethod("test");

答案 1 :(得分:4)

这是替代解决方案(我首选):

(this as MyInterface).MyMethod("test");

为什么? - 因为前面提供的解决方案在扩展方法调用类的“新”方法(属性也是方法)的情况下不起作用。在这种情况下,可能打算在基类/接口声明的类型上调用扩展方法,这可能与派生类/接口的行为不同。

此外,此解决方案适用于“新”和“覆盖”方法,因为虚拟“覆盖”无论如何都会调用派生版本,这也是有意的。

编辑:如果你真的不想将“base”传递给扩展方法而是允许它接受“this”,这可能是无关紧要的。但是,您必须考虑行为差异。

另外,有趣的是作为Darin Dimitrov评论的答案:扩展方法需要实例来运行它们,因为它们是静态方法。您可以通过向其传递参数来将扩展方法作为静态调用。但是,“base”不是扩展方法声明中标有“this”的参数的有效参数值,如果我是MS,则可以简化扩展方法的一般用法。

答案 2 :(得分:3)

请尝试以这种方式调用它:

this.MyMethod("test");

答案 3 :(得分:0)

将通话更改为

this.MyMethod("test")

此代码编译:

public static class MyExtensions
{
  public static void MyMethod( this MyInterface obj, string txt )
  {
  }
}

public interface MyInterface {}

public class MyDerived : MyInterface
{
  void DoStuff()
  {
    this.MyMethod( "test" ); // works now
  }
}