在F#中获取编译时模块的类型

时间:2018-07-20 11:57:53

标签: f# compile-time-constant

我们知道在C#中,我们可以使用typeof(OutType)在编译时获取类型的类型,这使我们稍后将其传递给属性,因为它是常量表达式。

我看到了this问题,但它并没有真正解决编译时间的使用问题。

所以我的问题是:有没有办法在F#标准库中以编译类型获取给定模块的System.Type

2 个答案:

答案 0 :(得分:2)

F#不允许通过设计使用其typeof运算符来获取模块的类型,因为它们不是该语言中的一流概念。

spec的13.2节:

  编译

F#模块以提供相应的已编译CLI类型声明,并   System.Type对象,尽管无法使用typeof访问System.Type对象   操作员。

模块会编译为静态类,因此可以在运行时使用反射获取类型(这就是typeof<MyModule.Dummy>.DeclaringType示例中发生的情况),并且有可能获取在引用中定义的模块的类型在C#中使用typeof运算符进行F#汇编。

对于您要尝试做的事情,最好使用类而不是模块,因为这样您就可以轻松掌握类型:

type MyFactoryClass = 
    static member TestCases = [ 1; 2; 3 ]

...

[<Test; TestCaseSource(typeof<MyFactoryClass>, "TestCases">] 
let test (arg: int) = ...

答案 1 :(得分:1)

如果可以引用该模块中的一种类型(如果没有类型,则创建一个虚拟类型),可以这样做:

#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char **argv)
{
  QGuiApplication app(argc, argv);

  QQuickView* view{new QQuickView};
  view->setSource(QUrl("qrc:///qml/main_window_presenter.qml"));
  view->show();

  return app.exec();
}