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

roy*_*yco 4 f# type-providers

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

codegen如何适应?

Ank*_*kur 7

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

例如:在SQL类型提供程序的情况下,表示表的类型将在编译时生成,并作为静态类型放入程序集中.


Tom*_*cek 5

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

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

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