Как вызвать метод расширения, который имеет то же имя, что и существующий метод?

Возможный дубликат:
Есть ли способ в С# переопределить метод класса с помощью метода расширения?

У меня есть код вроде

public class TestA
{
    public string ColA { get; set; }
    public string ColB { get; set; }
    public string ColC { get; set; }
    public void MethodA()
    {
        MessageBox.Show("Original A1.");
    }
}

static class ExtenstionTest
{

    public static void MethodA(this TestA A1)
    {
        MessageBox.Show("Extended A1.");
    }
}

Теперь, если я вызываю MethodA как

TestA a = new TestA();
        a.MethodA();

Он всегда будет вызывать метод Original. Как я могу вызвать метод расширения.

Ответы

Ответ 1

Вы не можете вызвать метод расширения как обычный метод расширения. Метод экземпляра переопределяет метод расширения с той же сигнатурой

ИЗМЕНИТЬ:

Вы можете назвать его статическим методом

ExtensionTest.MethodA(a);

Ответ 2

Вы не можете назвать его как метод расширения. В настоящее время это бесполезно, поскольку это метод расширения. (Лично мне хотелось бы, чтобы это было предупреждением, но неважно.)

Компилятор пытается использовать все возможные методы экземпляра, прежде чем пытается разрешить методы расширения. Из раздела 7.6.5.2 спецификации С# 4:

При вызове метода одной из форм [...], если нормальная обработка f вызывает неприемлемые методы, делается попытка обработать конструкцию как вызов метода расширения.

и позже:

Предыдущие правила означают, что методы экземпляра имеют приоритет над методами расширения

Вы можете называть его как обычный статический метод:

// Fixed typo in name
ExtensionTest.MethodA(a);

Ответ 3

Методы расширения - MSDN

Метод расширения с тем же именем и подписью как интерфейс или метод класса никогда не будут называться. Во время компиляции, методы расширения всегда имеют более низкий приоритет, чем методы экземпляра, определенные в самом типе.

Вы можете вызвать метод расширения как обычный статический метод класса.

ExtenstionTest.MethodA(a);

Из MSDN

Другими словами, если тип имеет метод Process (int i), и вы имеют метод расширения с той же сигнатурой, компилятор будет всегда привязывайтесь к методу экземпляра. Когда компилятор сталкивается с вызов метода, он сначала ищет совпадение в экземпляре типа методы. Если совпадение не найдено, оно будет искать любое расширение методы, определенные для типа, и привязка к первому расширению метод, который он находит. В следующем примере показано, как компилятор определяет, какой метод расширения или метод экземпляра связывать к.

Ответ 4

Вы можете вызвать метод расширения как любой другой статический метод:

ExtenstionTest.MethodA(a);

Ответ 5

поскольку другие предположили, что вы не можете назвать этот метод. Единственный способ его вызова таков:

TestA a = new TestA();
ExtenstionTest.MethodA(a);