C # 3.0 Методы расширения добавляют расширения к базовому типу, делая вызов этого метода во всех экземплярах этого типа допустимым.
Теперь JavaScript, который я знаю, реализует IDispatchEx, с помощью которого можно добавлять методы к конкретному экземпляру.
Итак, как мне добавить набор методов к «экземпляру» класса C #? Я знаю, что это священная военная территория динамических и статических языков. :) Позвольте мне уточнить, что мое намерение это НЕ так.
Я просто хочу иметь возможность добавлять набор событий в интерфейс в зависимости от класса, реализующего этот интерфейс.
Я смог сделать это, используя Generics
inteface ISample<T> { T SupportedEvents; }
class Sample : ISample<UIWidgetEvent> { }
class Sample2 : ISample<NonVisualUIWidget> { }
class UIWidgetEvent { public EventHandler Clicked; }
class NonVisualUIWidget {public EventHandler Expired;}
class TestSample
{
public void Test()
{
new Sample().SupportedEvents.Clicked += ...
new Sample2().SupportedEvents.Expired += ...
}
}
Тогда мне не понравилось SupportedEvents
Я хочу иметь возможность сказать
new Sample().Clicked +=...
Тогда я подумал, что JavaScript (я знаю, C#
не JS
:)) ... И IDispatchEx
, IL Weaving
, Reflection.Emit
и т. Д. И т. Д. И т. Д., И подумал, что есть способ сделать это ... [Поддержка времени разработки была бы хороша, но я могу жить без]
Да, я, вероятно, мог бы сделать это "расширение экземпляра" с помощью шаблона Visitor.
[Не уверен, смогу ли я получить синтетический сахар, хотя]
Комментарии