Я нахожу их очень естественным способом расширения существующих классов, особенно когда вам просто нужно "спрятать" некоторые функции на существующий класс.
Microsoft говорит: "В целом мы рекомендуем использовать методы расширения экономно и только тогда, когда вам нужно". И все же методы расширения составляют основу Linq; на самом деле, Linq был причиной, по которой были созданы методы расширения.
Существуют ли конкретные критерии проектирования, когда использование методов расширения воспринимается по наследованию или составу? По каким критериям они обескуражены?