Вызывать методы расширения базового класса C # из производного класса? - PullRequest
10 голосов
/ 06 июня 2011

Это надуманный пример:

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 ]

18 голосов
/ 06 июня 2011

Попробуйте вызвать его как this:

this.MyMethod("test");
4 голосов
/ 05 ноября 2012

Вот альтернативное решение (предпочитаемое мной):

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

Почему? - потому что решение, предоставленное ранее, не будет работать в тех случаях, когда метод расширения вызывает метод "new" класса(свойство тоже метод).В таких случаях вы можете намереваться вызвать метод расширения для типа, объявленного базовым классом / интерфейсом, который может вести себя иначе, чем производный класс / интерфейс.

Также это решение будетработать как с «новыми», так и с «переопределенными» методами, потому что виртуальное «переопределение» в любом случае вызовет производную версию, что также было бы предназначено.на самом деле не хочу передавать "base" в метод расширения и вместо этого позволить ему принять "this".Однако вы должны учитывать поведенческие различия.

Также интересно отметить в качестве ответа на комментарий Дарина Димитрова: методы расширения не требуют экземпляра для их запуска, потому что они статическиеметоды.Вы можете вызвать метод расширения как статический, передав ему параметры.Однако «base» не является допустимым значением параметра для параметра, отмеченного «this» в объявлении метода расширения, что (если бы я был MS) позволило бы упростить общее использование методов расширения.

3 голосов
/ 06 июня 2011

Попробуйте назвать это так:

this.MyMethod("test");
0 голосов
/ 06 июня 2011

Изменить вызов на

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