Можно ли применить к классу методы расширения?
Например, расширите DateTime, чтобы включить метод Tomorrow (), который можно было бы вызывать следующим образом:
DateTime.Tomorrow();
Я знаю, что могу использовать
static DateTime Tomorrow(this Datetime value) { //... }
Или
public static MyClass {
public static Tomorrow() { //... }
}
для аналогичного результата, но как я могу расширить DateTime, чтобы я мог вызывать DateTime.Tomorrow?
источник
Используйте метод расширения .
Пример:
Использование:
или
источник
DateTime.Tomorrow()
поскольку методы расширения работают только с ЭКЗАМЕНАМИ класса и структуры класса. Чтобы «расширить» статический метод в структуре класса, следуйте ответам Эндрю или Шугги .Методы расширения - это синтаксический сахар для создания статических методов, первый параметр которых является экземпляром типа T, похожим на метод экземпляра на T.
Таким образом, выгода в значительной степени теряется, когда вы создаете `` статические методы расширения '', поскольку они могли бы запутать читателя кода даже больше, чем метод расширения (поскольку они кажутся полностью квалифицированными, но фактически не определены в этом классе) без синтаксической выгоды (например, возможность связать вызовы в свободном стиле в Linq).
Поскольку вам все равно придется вводить расширения в область видимости с помощью using, я бы сказал, что проще и безопаснее создать:
А затем используйте это в своем коде через:
источник
Наиболее близкий к ответу я могу дать ответ, добавив в
System.Type
объект метод расширения . Не очень красиво, но все же интересно.В противном случае у IMO Andrew и ShuggyCoUk есть лучшая реализация.
источник
Type
может быть заменен любым другим необходимым типом. Я использую его,From
и он отлично работает. так что я предполагаю, что это общий, но правильный ответЯ бы сделал то же самое, что и Куму
но назовите это так: new DateTime (). Tomorrow ();
Думаю, это делает больше просмотров, чем DateTime.Now.Tomorrow ();
источник
Они предоставляют возможность расширять существующие типы, добавляя новые методы без необходимости изменения типа. Вызов методов из объектов расширенного типа в приложении с использованием синтаксиса метода экземпляра известен как «расширяющие» методы. Методы расширения не являются членами экземпляра типа. Ключевой момент, о котором следует помнить, заключается в том, что методы расширения, определенные как статические методы, входят в область видимости только тогда, когда пространство имен явно импортируется в исходный код вашего приложения через директиву using. Несмотря на то, что методы расширения определены как статические методы, они по-прежнему вызываются с использованием синтаксиса экземпляра.
Посмотрите полный пример здесь http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201
Пример:
источник
Я искал нечто подобное - список ограничений для классов, которые предоставляют методы расширения. Кажется, сложно найти краткий список, поэтому вот:
У вас не может быть ничего личного или защищенного - полей, методов и т. Д.
Это должен быть статический класс, например
public static class...
.В классе могут быть только методы, и все они должны быть общедоступными статическими.
У вас не может быть обычных статических методов - те, которые не включают аргумент this, не допускаются.
Все методы должны начинаться:
общедоступный статический ReturnType MethodName (this ClassName _this, ...)
Таким образом, первым аргументом всегда является ссылка this.
Это создает неявную проблему - если вы добавляете методы, требующие блокировки любого вида, вы действительно не можете обеспечить ее на уровне класса. Обычно вы предоставляете частную блокировку на уровне экземпляра, но невозможно добавить какие-либо частные поля, что оставляет вам некоторые очень неудобные варианты, например, предоставление его в качестве общедоступной статики для некоторого внешнего класса и т. Д. Получается рискованно. Признаки того, что язык C # оказался плохим в их дизайне .
Обходной путь - использовать ваш класс метода расширения как фасад для обычного класса, а все статические методы в вашем классе расширения просто вызывают реальный класс, возможно, используя синглтон .
источник
К сожалению, вы не можете этого сделать. Я считаю, что это было бы полезно. Естественнее набрать:
чем:
С классом Util вы должны проверить наличие статического метода в двух разных классах вместо одного.
источник
Мы улучшили наш ответ подробным объяснением, теперь стало проще понять метод расширения
Способ расширения : это механизм, с помощью которого мы можем расширить поведение существующего класса без использования подкласса или модификации или перекомпиляции исходного класса или структуры.
Мы можем расширить наши собственные классы, классы .NET Framework и т. Д.
Метод расширения - это особый вид статического метода, который определяется в статическом классе.
Поскольку
DateTime
класс уже взят выше, мы не использовали этот класс для объяснения.Ниже приведен пример
// Это существующий класс калькулятора, у которого есть только один метод (Добавить)
источник