Тип Providers - Могу ли я генерировать тип во время компиляции, который каким-то образом украшает все методы типа?

Я читал о больших возможностях Type Providers, таких как статическая типизация при запросе документов JSON, поэтому я могу представить, что я могу создать то, что у меня на уме, с этой технологией.

Скажем, я хочу разрешить потребителю моей библиотеки TypeProvider Foo создать шаблон типа, который будет иметь следующее предварительное условие для каждого из своих методов: проверьте изменчивое состояние поля boolean disposed если оно истинно, вызовите ObjectDisposedException.

Возможно ли это? Как можно определить такую ​​реализацию этого создателя типа высокого уровня?

Ответ 1

Несколько лет назад Кейт Баттокки опубликовал проект под названием ILBuilder. Среди прочего ILBuilder содержит поставщика типа метода в ILBuilder.fs, который предоставляет методы для типов в mscorlib, например.

MethodProvider.Methods.System.Console.``WriteLine : string*obj->unit`

Возможно, вы могли бы использовать это как отправную точку для поставщика типов, который переносит классы из другой сборки и предоставляет методы.

Другой вариант может состоять в том, чтобы рассмотреть Ross McKinlay Поставщик типа Mixin, который (ab) использует механизм поставщика F # Type для обеспечения возможностей метапрограммирования.

Еще одним вариантом может быть использование PostSharp, Fody и т.д., чтобы сделать IL ткачество или генерация кода посредством отражения для создания прокси-классов.

Это, пожалуй, самое низкое решение о трении будет заключаться в создании функции, которая проверяет удаление и вручную добавляет ее каждому члену.