gpt4 book ai didi

c# - 如何将 F# 类型提供程序生成的类型公开给 C# 和 XAML

转载 作者:太空狗 更新时间:2023-10-30 00:50:26 25 4
gpt4 key购买 nike

所以,我正在使用 XML Type Provider从 XML 文档创建类型。

XML 文件中的一个元素具有 Date 属性:

<Edit Date="06/30/2015 16:57:46"
... />

这当然会导致这样的类型:

type Edit = 
inherit XmlElement

member Date: DateTime
...

有什么方法可以添加以下代码:

 member this.LocalTime
with get() =
this.Date.ToLocalTime()

到生成的 Edit 类型?

这样做的原因是我从 XAML 绑定(bind)到 Edit 的实例,我真的不想为此编写一个 IValueConverter

编辑:

所以,我才意识到这些类型没有出现在我的 XAML 中。相反,我得到了 FSharp.Data.Runtime.BaseTypes.XmlElement 的实例,当然它甚至不包含我在 F# 代码中看到的属性。我还需要从 C# 代码中使用这些类型,即使在那里我也只得到没有属性的 XmlElement

我知道我可以在 XAML 中使用 XPath 来导航其中的 XElements,但我仍然需要一种方法来以强类型方式从 C# 和 XAML 访问生成的对象模型。

编辑2:

所以现在我写了一个Type Extension像这样:

type Catalog.Edit with
member this.LocalTime with get() = this.Date.ToLocalTime()

我在 F# 代码中看到的成员就像生成的成员一样。但是,这种方法有两个缺点:

1 - 它迫使我将我的 namespace 更改为 module,这不太方便,因为这些类型都是从 C# 代码中使用的,并且在其中我将它们视为将类嵌套到模块类中,这很丑。

2 - 我仍然无法从 C# 或 XAML 中看到此成员(也无法看到生成的成员)。

在所描述的场景中,正确的实现方法是什么?

最佳答案

XML 和 JSON 的 F# 数据类型提供程序是删除类型提供程序。这意味着您在 F# 中使用它们时看到的类型在运行时实际上并不存在 - 它们被替换为一些底层运行时表示(此处为 XmlElement)。

不幸的是,这意味着这些类型不是真正的 类型,因此它们只对 F# 可见。

我的建议是使用 F# 记录定义一个简单的域类型,并将您的数据从 XML 加载到您的记录中。这需要做更多的工作,但它也为您提供了更多的安全性,因为您明确定义了结构 - 因此如果您的 XML 更改,您将知道您也需要更改您的 XAML 代码!

它应该像这样简单:

type Edit = { Date : DateTime }

let GetData () =
let doc = MyXmlType.Load("somefile.xml")
seq { for item in doc.Edits -> { Date = item.Date } }

关于c# - 如何将 F# 类型提供程序生成的类型公开给 C# 和 XAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com