void.pointer
void.pointer

Reputation: 26345

Invoking C# base class extension methods from inside derived class?

This is a contrived example:

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?
  }
}

In my example above, I'm trying to call an extension method assigned to an interface from my derived class. The compiler fails here and says that MyMethod does not exist in the current context. I have all the appropriate using statements in my CS file, so I'm not sure what is going on.

Upvotes: 10

Views: 3361

Answers (4)

Tengiz
Tengiz

Reputation: 8399

Here is alternate solution (preferred by me):

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

Why? - because the solution provided previously will not work in cases when extension method calls class's "new" method (property is a method too). In such cases you may intend to call an extension method on the type declared by the base class/interface, which might behave differently from the derived class/interface.

Also, this solution will work for both "new" and "override" methods, because virtual "override" will anyway invoke derived version, which would be also intended.

EDIT: this may be irrelevant if you don't really want to pass "base" to the extension method and instead allow it take "this". However, you must consider behavioral differences.

Also, interesting to note as an answer to the comment by Darin Dimitrov: extension methods don't require instance to run them, because they are static methods. You can invoke an extension method as static by passing parameters to it. However, "base" is not a valid parameter value for parameter marked with "this" in the extension method declaration, which (if I were MS), would allow to simplify general usage of extension methods.

Upvotes: 4

asawyer
asawyer

Reputation: 17808

Change the call to

this.MyMethod("test")

This code compiles:

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
  }
}

Upvotes: 0

Adam Maras
Adam Maras

Reputation: 26853

Try calling it this way instead:

this.MyMethod("test");

Upvotes: 3

Darin Dimitrov
Darin Dimitrov

Reputation: 1038730

Try invoking it like this:

this.MyMethod("test");

Upvotes: 19

Related Questions