Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在F中获取编译时的模块类型#_F#_Compile Time Constant - Fatal编程技术网

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

F# 在F中获取编译时的模块类型#,f#,compile-time-constant,F#,Compile Time Constant,我们知道,在C#中,我们可以在编译时使用typeof(OutType)获取类型的类型,这让我们可以稍后将其传递给属性,因为它是常量表达式 我看到了这个问题,但它并没有真正解决编译时的使用问题 所以我的问题是:有没有一种方法可以在F#standard library的编译类型中获取给定模块的System.Type?如果您可以引用该模块中的类型(或者如果没有类型,则创建一个伪类型),您可以这样做: module MyModule = type Dummy = Dummy let myMod

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

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


所以我的问题是:有没有一种方法可以在F#standard library的编译类型中获取给定模块的
System.Type

如果您可以引用该模块中的类型(或者如果没有类型,则创建一个伪类型),您可以这样做:

module MyModule =
    type Dummy = Dummy

let myModule = typeof<MyModule.Dummy>.DeclaringType
模块MyModule=
类型虚拟=虚拟
设myModule=typeof.DeclaringType
F#不允许通过设计使用其
typeof
运算符获取模块的类型,因为它们在语言中不是一流的概念

从第13.2节:

F#模块被编译以提供相应的已编译CLI类型声明和 System.Type对象,但无法使用typeof访问System.Type对象 接线员

但是,模块编译为静态类,因此可以在运行时使用反射获取类型(在
typeof.DeclaringType
示例中就是这样),也可以使用C#中的
typeof
操作符获取在引用的F#assembly中定义的模块类型

对于您尝试执行的操作,最好使用类而不是模块,因为这样您就可以轻松地掌握类型:

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

...

[<Test; TestCaseSource(typeof<MyFactoryClass>, "TestCases">] 
let test (arg: int) = ...
类型MyFactoryClass=
静态成员TestCases=[1;2;3]
...
[] 
let测试(arg:int)=。。。

使用
.DeclaringType
意味着这不是编译时常量(也就是说,不能将其用作属性构造函数的参数)。为什么要特别尝试这样做?我理解你为什么需要一个编译时常量,但我不明白一旦你掌握了模块的运行时类型你会怎么做。我的案例我需要它来提供给NUnit的TestCaseSource属性重载我能在编译时获得它的类型吗?我知道我可以这样做,这就是为什么我在回答我的具体案例时从未坚持过的原因,但如果F和C的银行伴侣类型是1:1,那么使用
TestCaseSource
就成功了。