Методы расширения C # доступны только для методов экземпляра? - PullRequest
1 голос
/ 11 октября 2009

Я недавно начал использовать методы расширения C #. Примеры SO и документация предполагают, что они используются только для методов экземпляра (то есть с ключевым словом this). Можно ли использовать их (или другой подход) со статическими / классовыми методами?

(Мое конкретное требование - преобразование кода Java в C #, где «большая часть кода» не нуждается в редактировании. Методы экземпляра Java (например, Java String.indexOf()) могут быть направлены через метод расширения, вызывающий C # string.IndexOf()). Я хотел бы сделать то же самое для, скажем, Java Math.abs() => C # Math.Abs()).

РЕЗЮМЕ Нет. Ответы показывают, что это было бы разумно, но вряд ли это произойдет в ближайшее время. Обходные пути потребуют редактирования с созданием новых классов или чего-то подобного и могут не стоить этого.

Ответы [ 3 ]

3 голосов
/ 11 октября 2009

Вы не можете создавать статические методы расширения - это то, что я хотел бы сделать!

Вы можете создавать свои собственные статические классы со стандартным суффиксом, то есть MathJSyntax.abs (..), который будет вызывать Math.Abs ​​(..)

1 голос
/ 11 октября 2009

C # 3.0, к сожалению, не позволяет создавать методы статического расширения. Однако F # позволяет разрешить это, наряду с желаемой функцией свойств расширения .

0 голосов
/ 11 октября 2009

Сама нотация не позволяет вам сделать это, параметр класса "this" ожидает, что экземпляр класса будет передан. Если бы они намеревались хотя бы в конечном итоге добавить его, они бы не написали его так .

Так что короткий ответ - нет, и никогда не будет!

...