Ну, тут действительно два момента:
1) Хорошая ли идея создать метод расширения с this T
, чтобы он применялся ко всем типам?
2) Полезен ли конкретный описанный метод расширения?
Для 1-го вопроса ответ иногда бывает, но зависит от контекста. Вы можете применить метод расширения ко всем классам так же, как это делает linq, гарантируя, что вы выберете подходящее пространство имен. Я думаю, что создание такого типа метода расширения в пространстве имен System - плохая идея, но если бы он был более целенаправленным, то, возможно, это было бы полезно.
Для 2-го, поскольку вызов является немедленным, тогда выбор синтаксиса следующий:
int res = other.InvokeFunc<Other, int>(Callback);
var res2 = (new Func<Other, int>(Callback))(other);
var res3 = Callback(other);
Глядя на это, простой вызов метода, передающего экземпляр, является более естественным и типичным, однако, если ваш метод расширения становится более сложным, я возвращаюсь к своей первой мысли о том, что это зависит от контекста (который может помочь с инкапсуляцией).