Доступны ли методы расширения C# только для методов экземпляра?

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

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

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


person peter.murray.rust    schedule 11.10.2009    source источник


Ответы (3)


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

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

person xyz    schedule 11.10.2009
comment
@фру. Спасибо. На самом деле я создаю набор своих собственных классов, потому что, возможно, мне придется пойти и другим путем. Классы расширения просто делают его невидимым! - person peter.murray.rust; 11.10.2009
comment
Единственная проблема, с которой вы должны столкнуться, заключается в том, что существует существующий класс/метод .net с тем же именем, который не обеспечивает необходимую вам реализацию. Но это должно быть довольно редко. - person Jason Williams; 11.10.2009

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

person Noldorin    schedule 11.10.2009
comment
Что касается свойств расширения, я думаю, что недавний пост Эрика Липперта весьма интересен: blogs.msdn.com/ericlippert/archive/2009/10/05/ - person flq; 11.10.2009
comment
Да... Я до сих пор думаю, что жаль, что это не было реализовано. - person Noldorin; 11.10.2009

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

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

person Blindy    schedule 11.10.2009