问题描述
在F#中,直接放置在命名空间中的记录类型将被编译为C#的类类型。
e.g.,namespace MyNameSpace
type MyType = { Name: string; Content: string; Text: string }
MyType将被C#视为静态公共类。
但是C#在命名空间中的模块中如何查看MyType?
e.g.,namespace MyNameSpace
module MyModule
type MyType = { Name: string; Content: string; Text: string }
如果它是MyModule的私有文件,是否可以将其公开用于C#?
(我在Google上找不到此答案:()
TIA
解决方法
默认情况下,我相信所有模块成员都将遵循相同的公共静态声明形式。在此处编译示例会导致从C#中轻松访问MyType类:
static void Main(string[] args)
{
var foo = new MyNameSpace.MyModule.MyType("x","b","c");
}
为了强制对模块成员的访问控制,您需要稍微调整声明:
module MySecrets =
type private SecretType = { Password: string }
编辑:啊哈,找到相关页面:https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/access-control
, F#模块被编译为一个类。如果模块内有类型声明,它将被编译为嵌套类。在您的MyNameSpace.MyModule.MyType
的示例中,MyNameSpace
部分是名称空间,而MyModule
(还有MyType
)是类。
在C#中,您可以使用.
访问嵌套类,但是在CLR级别上,可以使用+
访问嵌套类,因此,如果要访问MyType
,例如使用{ {1}},您需要使用:
Type.GetType
请注意,这在F#Interactive中不起作用,F#Interactive向名称空间添加了另一个名称,但在编译后的代码中有效。我不确定WPF中的System.Type.GetType("MyNameSpace.MyModule+MyType")
的工作方式,但是您可能需要使用名称为DataTemplate
的CLR格式来指定类型。