Метод расширения — нужно ли использовать это ключевое слово?

#c# #asp.net #extension-methods

#c# #asp.net #методы расширения

Вопрос:

Я добавил метод расширения в ASP.NET System.Web.UI.Page. Каждая страница в моем приложении наследуется от этого класса.

Однако я не могу просто получить доступ к методу расширения. Я должен вводить this.MyMethod(); вместо того, чтобы просто иметь возможность использовать MyMethod() . Я думал, что методы / атрибуты this изначально находятся в области по умолчанию. Чего я не понимаю? Или это нюанс методов расширения?

Ответ №1:

Я думал, что методы / атрибуты этого изначально находятся в области по умолчанию.

Они есть. Но методы расширения не являются методами this в области видимости по умолчанию; это статические методы, доступные через синтаксический сахар, любезно предоставленный компилятором.

Я полагаю, вы уже знаете это, но просто чтобы уточнить: если ExtensionMethod это метод расширения класса, в области видимости которого вы сейчас находитесь, введите это:

 this.ExtensionMethod();
  

…это то же самое, что:

 SomeStaticClass.ExtensionMethod(this);
  

this необходимо передать в качестве параметра в ExtensionMethod . Первый способ, описанный выше, компилятор просто делает это за вас.

Естественно, они могли бы реализовать что-то по-другому, чтобы компилятор «включал» методы расширения, а также члены класса в область действия по умолчанию; они просто решили этого не делать. Лично мне это нравится; но я думаю, это субъективный вопрос. В любом случае, если вам не нравится печатать this , это всего лишь небольшая неприятность, верно?

Комментарии:

1. точно … поскольку класс, в котором определен метод расширения, является статическим, у вас никогда не может быть его экземпляра, и поэтому использование this недопустимо в теле метода.

2.@Paul: Я не думаю, что это то, о чем спрашивает OP. Я полагаю, ему интересно, почему, если он находится в коде для type T и у него включен метод расширения T , он должен вводить this.MyMethod() в коде для T вместо просто MyMethod() .

3. перечитывая вопрос два раза , вы абсолютно правы … 🙂 не то чтобы мой комментарий был неправильным, в любом случае, он просто не имеет отношения к этому конкретному вопросу.

Ответ №2:

является ли это нюансом методов расширения?

Да, это так. (Как объясняли другие.)

Если вы хотите использовать метод без каких-либо оговорок, то вы могли бы просто создать класс, который наследуется от Page и включает ваш метод (за вычетом первого параметра, конечно). Затем сделайте так, чтобы каждая страница в вашем приложении наследовалась от вашей новой пользовательской страницы.

Ответ №3:

Чтобы использовать метод расширения, вы должны объявить:

 using Namespace.Where.Extension.Method.Is.Located
  

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