酷炫新颖的F# 3.0功能类型提供程序可用于弥合F#数据类型或类与数据源结构(如XML或WSDL)之间的不匹配。然而,在其他.NET语言(如C#)中,这种不匹配也是一个挑战。
我想在C#代码中使用F# 3.0提供程序。如果有可能,我该怎么做?如果不能,那么C#实现需要具备哪些能力才能使用它们?
酷炫新颖的F# 3.0功能类型提供程序可用于弥合F#数据类型或类与数据源结构(如XML或WSDL)之间的不匹配。然而,在其他.NET语言(如C#)中,这种不匹配也是一个挑战。
我想在C#代码中使用F# 3.0提供程序。如果有可能,我该怎么做?如果不能,那么C#实现需要具备哪些能力才能使用它们?
我认为@kvb给出了一些技术难点的概述,我同意类型推断会有问题 - 你基本上只能在本地使用由提供程序生成的类型,类似于匿名类型。我认为C#可能会在Roslyn中提供类似的功能,但我怀疑它不会像在F#中那样优雅和平滑地集成(在F#中,类型提供程序实际上是语言特性而不仅仅是工具)。
回答您的两个具体问题:
[我如何]在C#代码中使用F# 3.0提供程序?
F#类型提供程序实际上只能由F#编译器理解,因此您需要从F#中使用它们。对于生成型提供程序(SQL,实体,WSDL,配置文件),您可以从F#引用提供程序,并从C#项目中使用生成的类型。
对于删除类型提供程序,您将无法做到这一点,因为这些类型并不存在,只有F#才能看到它们。因此,最好的选择是在F#中编写处理代码,并将结果作为记录或其他易于从C#中消耗的类型的集合返回。
一个C#实现需要什么才能使用它们?
当然,我可以只说“C#必须支持类型提供程序!”,但这里还有一些更多的想法。类型提供程序只是.NET程序集,它们不使用任何特定于F#的类型。任何.NET语言(包括C#)都可以使用ITypeProvider
接口,因此,如果C#设计人员希望,他们可以重用已经为F#构建的所有优秀提供程序。
vNext + 1 + ...
)中。目前,你只能在F#中获得所有的好处。let moviesStartingWith prefix =
query {
for movie in MyDataSource.Movies do
where (movie.Title.StartsWith(prefix) }
|> Seq.toList
List<DataSource.ServiceTypes.Movie>
),这会变得很麻烦,即使使用IntelliSense,我也需要浏览提供的类型集来生成签名,以及浏览提供的值集来生成查询。当然,这也适用于除了类型提供程序之外的其他领域,但是我认为对于某些提供程序自然生成的嵌套类型层次结构,这在实践中尤其痛苦,因为类型名称变得极长。MyDataSource.Movies
传递进去会绑定类型参数,而无需指定闭合类型,并且保留返回类型为List<T>
。 - codekaizen