Когда у вас есть автомобиль класса, который реализует IVehicle, и вы хотите обернуть его в декоратор, который переадресует все вызовы на автомобиль и подсчитывает их, как бы вы это сделали?Каков самый короткий способ реализации класса прокси или декоратора в C#?
В Ruby я мог просто построить декоратор без каких-либо методов и использовать метод_missing для переадресации всех вызовов на объект автомобиля.
В Java я мог бы создать объект Proxy, который запускает весь код через один метод и пересылает его впоследствии.
Есть ли что-нибудь подобное в C#?
обновление:
на основе ответившим и что i've читать о System.Reflection.Emit должно быть возможно написать метод похож на это:
Type proxyBuilder(Type someType, delagate functionToBeApplied, Object forward)
где тип реализует весь интерфейс someType, выполняет функцию FunctionToBeApplied, а затем перенаправляет вызов метода объекту, возвращая его возврат.
Есть ли какая-нибудь библиотека, которая делает именно это, или мне нужно написать свой собственный?
, пожалуйста, объясните в двух словах, что означает «использование« FooBase »строго необязательно» означает? это предикат «разрешено любое« IFoo' »? точка с запятой заставляет меня читать инструкцию (ы) отдельно, и аргумент является самодостаточным, чтобы добавить путаницу. несмотря на cpt. Очевидный шепот: «это просто означает, что« FooBase »может быть заменен любым другим« IFoo », реализующим« IFoo »способом« FooBase' », я буду разочарован, если все будет так просто. не разочарован ответом, который хорош, а скорее с моей паранойей. извините за «вербальность» (теперь мне нужно найти идиому, соответствующую этому явлению) –
Я думаю, что это ваш неутешительный ответ; код должен зависеть только от 'IFoo'; 'FooBase' - это просто удобство для кода, который выбирает реализацию' IFoo'. –
спасибо!если у вас есть время, ответьте еще на два вопроса: ** 1) ** этой теме уже 6 лет, похоже, с тех пор ничего не изменилось, и способы решения проблемы все те же? * (никогда не думал, что я пропущу C++, но у него есть '->' перегрузка) * ** 2) ** я ошибаюсь: вы говорите, что это плохая практика наследовать от абстрактных классов? Я сам считаю их интерфейсами с реализацией по умолчанию, и они довольно удобны. и, по-видимому, может ссылаться на экземпляры SomeFoo как 'IFoo'. * (в то же время, ms внедренный метод расширений методов)) * –