我想知道是否可以使用Reflection.emit
(或其他任何内容)在f#中生成DU,或者甚至将新案例添加到已定义的DU中。
我一直在查看msdn网站,我发现我所能做的就是获得工会案件或创建工会案件。使用FSharpValue.MakeUnion
或使用Expr.NewUnionCase
引文创建它们。
我使用这种方法的问题是我如何能够以这样的方式绑定它们,即我所做的联合案例属于同一个DU?也许这不是解决这个问题的方法。在那种情况下,我将如何动态生成DU?
P.S:目标是在类型提供程序中生成DU。这意味着,如果我没有错,那么当编译成.dll文件时,我将能够访问脚本文件中由 TypeProvider 生成的DU。这意味着我可以在DU的实例上应用模式匹配,并且还可以获得DU提供的类型安全性(例如,模式匹配中所有情况的详尽性)。
答案 0 :(得分:6)
我会看一下F# Compiler Services动态生成有区别的联合。基本上,您依靠F#编译器来生成所需的类型。我有限的理解是,记录和有区别的联合都需要在类型之外的某种程序集元数据,以便F#编译器识别它们。如果您沿着Reflection.Emit路线走下去,则需要确保所有生成的程序集都具有此元数据(如果可能通过该API)。
从F#4.0起,类型提供者现在无法公开记录和受歧视的联盟。有a F# Uservoice suggestion for it;但它可能需要一段时间才能成为语言。我要做的是使用上面的编译器服务生成一个联合,并添加一个“匹配”成员,其中包含模式匹配。
,当它通过类型提供者机制时,它将不是官方的“DU”