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

时间:2015-07-14 00:56:23

标签: f# metaprogramming type-providers

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

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

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

1 个答案:

答案 0 :(得分:7)

几年前,Keith Battocchi发布了一个名为ILBuilder的项目。 ILBuilder包含ILBuilder.fs中的方法类型提供程序,为mscorlib中的类型提供方法,例如。

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

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

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

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

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