#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
И не забывайте, что класс, содержащий метод расширения, должен быть статическим.