F#3.0类型提供商是否在引擎盖下使用DLR?

时间:2011-10-16 04:08:47

标签: f# type-providers

F#类型的提供商是否可以在引擎盖下使用DLR?也就是说,它们是否以C#中dynamic关键字的方式工作?这与expando对象有什么关系?

codegen如何适应?

2 个答案:

答案 0 :(得分:7)

类型提供程序是编译过程的插件。在内部,类型提供程序可以使用DLR或任何其他东西,但是当编译器询问它的类型时,它需要返回在编译时静态解析的类型。想想它而不是人类创建一个类型(C#中的类),你有一个程序集(类型提供者),编译器可以要求它在编译时创建一个新类型。

Ex:对于SQL类型提供程序,表示表的类型将在编译时生成,并作为静态类型放入程序集中。

答案 1 :(得分:5)

类型提供程序解决了与C#中的dynamic关键字类似的问题 - 它们都旨在使访问具有某些结构的数据变得更加容易,这些结构未在您的编程语言中描述,因此您需要以某种方式推断它以后。

动态关键字只允许您在编译时访问任何成员(即数据字段)或方法,然后决定如何在运行时处理操作。如果您使用它来访问.NET对象,那么它将使用DLR,但如果您正在访问其他一些对象(如JSON数据),那么它将执行一些简单的字典查找。

F#类型提供程序非常不同 - 它们在编译时推断结构并将其传递给F#编译器。然后编译器将检查您的所有代码。类型提供程序还决定如何编译对字段或方法的访问。通常,它将用普通的.NET类型替换它(因此它将被编译为普通的.NET调用),或者它将用一些字典查找替换该对象。类型提供者可以在封面下使用DLR,但我不认为这是非常常见的情况。