Во всех ответах здесь говорилось «ты не можешь», что верно, насколько это возможно. Больше всего добавлено "а ты не должен". Я хотел бы привести аргумент в пользу того, что вы сможете это сделать - небольшое удобство, как это может быть.
Возьмите болезненный пример из реальной жизни: если вам не повезло использовать новую инфраструктуру MVC, и ваш код представления везде использует какой-то метод расширения HtmlHelper, и вы хотите переопределить его поведение по умолчанию ... что то
Вы СОЛ, вот что. Даже если вы сделали «OOP вещь» - наследовать от HtmlHelper, измените класс базового представления, чтобы заменить экземпляр объекта «Html» на экземпляр вашего DerivedHtmlHelper, и определите в нем явный метод «Foo» - даже если вы все что вызов Html.Foo все же вызовет оригинальный метод расширения, а не метод.
Это удивительно! В конце концов, методы расширения должны применяться только в том случае, если у объекта еще нет метода! Что здесь происходит?
Ну, это потому, что методы расширения - это static функция. То есть при просмотре «Html.Foo» компилятор просматривает тип «Html» static . Если у него есть метод Foo, он вызывается как обычно. В противном случае, если SomeClass предоставляет метод расширения Foo, он преобразует выражение в SomeClass.Foo (Html).
Вы ожидаете, что компилятор будет учитывать динамический тип объекта. То есть, что сгенерированный (псевдо-) код будет читать 'Html.HasMethod ("Foo")? Html.Foo (): SomeClass.Foo (Html) '.
Это, конечно, повлечет за собой затраты на использование отражения в каждом вызове метода расширения. Таким образом, можно ожидать, что вы могли бы написать что-то вроде «static void Foo ( virtual this HtmlHelper html)», чтобы явно запросить компилятор вставить проверку во время выполнения. Назовите это «методом виртуального расширения».
Однако в своем ограниченном бюджете и бесконечной мудрости разработчики языка C # выбрали только более эффективную и более ограниченную альтернативу. Что оставляет меня по-прежнему SOL, когда мне нужно переопределить поведение по умолчанию HtmlHelper: - (