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

使用Reflection.Emit生成有区别的联合,reflection,f#,reflection.emit,type-providers,discriminated-union,Reflection,F#,Reflection.emit,Type Providers,Discriminated Union,我想知道是否可以使用Reflection.emit(或其他任何东西)在f#中生成DU,或者甚至向已经定义的DU添加新的情况 我一直在看msdn网站,我发现我所能做的就是获得工会案例或创建工会案例。通过使用FSharpValue.MakeUnion或使用带有Expr.NewUnionCase的引号来创建它们 我使用这种方法的问题是,我如何能够以这样的方式绑定它们,使我创建的联合案例属于同一个DU?也许这不是解决这个问题的正确方法。在这种情况下,如何动态生成DU p.S:目标是在类型提供程序内生成D

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

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

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


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

我将研究如何动态生成有区别的联合。基本上,您需要依赖F#编译器来生成所需的类型。我有限的理解是,记录和有区别的联合都需要某种类型之外的程序集元数据,以便F#编译器识别它们。如果您选择Reflection.Emit路径,则需要确保任何生成的程序集都具有此元数据(如果可能的话),通过该API


从F#4.0开始,类型提供程序现在无法公开记录和有歧视的联合。有;但它可能需要一段时间才能成为语言。我要做的是使用上面的编译器服务生成一个联合,并在其中添加一个模式匹配的“Match”成员。当它通过类型提供程序机制时,它不会成为正式的“DU”,但仍然可以工作。

感谢您的解释。我目前正在尝试按照您的建议进行操作,但是我不太明白如何使用F#编译器服务生成任何DU。我唯一发现的是以下编译器.SourceCodeServices.FSharpUnionCase,但据我所知,您只能获得有关现有union案例的信息。我正在尝试,但我不知道如何使用编译器服务生成任何类型。请参阅文档中的“托管F#编译器”部分。您为它指定代码,它将根据您使用它的方式创建普通或动态程序集。你所要做的就是给它一个代码来代表你的未婚妻。哦,我明白了,所以它看起来像是某种漂亮的印刷品。当然,这也意味着,如果我已经定义了不同的类型(例如type1..typeN),我可以将它们添加到DU的代码中,当编译时,DU将真正绑定到它们。我现在明白了。谢谢