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

10
我阅读了有关类型提供程序的强大功能,例如在查询JSON文档时进行静态类型检查,因此我可以想象使用这项技术来创建我目前所想的东西。
假设我想让我的TypeProvider库Foo的消费者创建一种名为Bar的类型,并对每个方法设置以下先决条件:检查一个名为boolean disposed的可变状态字段,如果它为true,则抛出ObjectDisposedException。
这是否可能?如何定义此高级类型创建器的实现?

你可能能够拼凑出一些基本可用的东西,但总的来说,类型提供程序并不适合那种元编程。特别是,在汇编A中,你只能为在A之外声明的类型提供它 - 因为类型提供程序无法访问运行它们的程序集中有关类型的信息。 - scrwtp
1个回答

7

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

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

可以将此作为封装另一个程序集并提供方法的类型提供程序的起点。
另一个选择可能是考虑Ross McKinlay的Mixin Type Provider,它(滥用)F#的Type Provider机制提供元编程功能。
另一个选项可能是使用PostSharpFody等进行IL编织,或通过反射生成代码来构建代理类。
话虽如此,最低摩擦的解决方案可能是创建一个检查清除的函数,并手动将其添加到每个成员中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接