类型提供程序 - 我可以在编译时生成一个类型以某种方式装饰类型的所有方法吗?

kno*_*cte 10 f# metaprogramming type-providers

我已经了解了类型提供程序的强大功能,例如查询JSON文档时的静态类型,所以我可以想象我现在能用这项技术创建我脑海中的内容.

假设我想允许我的TypeProvider-library Foo的使用者创建一个类型Bar,它将为每个方法提供以下前提条件:检查boolean disposed字段的可变状态,如果它是真的,抛出一个的ObjectDisposedException.

这可能吗?如何定义这种高级类型创建者的实现呢?

Phi*_*ord 7

几年前,Keith Battocchi发布了一个名为ILBuilder的项目.除其他事项外ILBuilder包含在方法类型提供ILBuilder.fs提供用于在mscorlib程序类型,例如方法

MethodProvider.Methods.System.Console.``WriteLine : string*obj->unit`
Run Code Online (Sandbox Code Playgroud)

您可以将此作为类型提供程序的起点,该类型提供程序包装来自另一个程序集的类并提供方法.

另一种选择可能是考虑Ross McKinlay的Mixin Type Provider(ab)使用F#的Type Provider机制来提供元编程功能.

另一种选择可能是使用PostSharp,Fody等来进行IL编织,或者通过反射生成代码来构建代理类.

也就是说,最低摩擦解决方案可能是创建一个检查处理并手动将其添加到每个成员的功能.