使用Reflection.Emit生成有区别的联合

Lel*_*tch 2 reflection f# reflection.emit discriminated-union type-providers

我想知道是否有可能在f#中使用Reflection.emit(或其他任何东西)生成DU,或者甚至在已经定义的DU中添加新的情况.

我一直在寻找msdn网站,我发现我所能做的就是获得工会案件或创建工会案件.通过使用FSharpValue.MakeUnion或使用引号Expr.NewUnionCase来创建它们.

我使用这种方法的问题是我如何能够以这样的方式绑定它们,即我所做的联合案例属于同一个DU?也许这不是解决这个问题的方法.在那种情况下,我将如何动态生成DU?

PS:目标是在Type提供程序中生成DU .这意味着,如果我没有错,那么当编译成.dll文件时,我将能够访问脚本文件中由TypeProvider生成的DU .这意味着我将能够在DU的实例上应用模式匹配,并且还获得DU提供的类型安全性(例如,模式匹配中的所有情况的详尽性).

aka*_*ara 6

我会看一下F#Compiler Services来动态生成有区别的联合.基本上,您依靠F#编译器来生成所需的类型.我有限的理解是,记录和有区别的联合都需要在类型之外的某种程序集元数据,以便F#编译器识别它们.如果您沿着Reflection.Emit路线走下去,则需要确保所有生成的程序集都具有此元数据(如果可能通过该API).

从F#4.0开始,类型提供者现在无法公开记录和受歧视的联盟.有一个F#Uservoice建议吗?但它可能需要一段时间才能成为语言.我要做的是使用上面的编译器服务生成一个联合,并添加一个"匹配"成员,其中包含模式匹配.当它通过类型提供程序机制时它不会是官方的"DU",但仍然可以工作.