F# 在F中获取编译时的模块类型#
我们知道,在C#中,我们可以在编译时使用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
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
就成功了。