1

在 F# Web 应用程序中使用某种 C# 类型时遇到问题。我在 F# 应用程序中引用的库中存在以下 C# 类型:

public static class OuterType
{
    public class Model
    {
        private readonly string id;
        private readonly bool selected;
        private string name;

        internal Model() : this(string.Empty) { }
        public Model(string id) : this(id, false) { }
        public Model(string id, bool selected)
        {
            this.id = name = id;
            this.selected = selected;
        }

        [Localizable(false)]
        public string ID => id;
        public bool Selected => selected;
        [Localizable(true)]
        public string Name
        {
            get => name;
            set => name = value;
        }
    }
}

我已经为它编写了一个代理(作为我的 F# web 应用程序的一部分):

[<Proxy(typeof<OuterType.Model>)>]
type ProxyModel =
    {
        ID : string
        Selected : bool
        Name : string
    }

我的项目编译正常,但我收到运行时序列化错误:

System.Exception:RPC JSON 转换期间出错 ---> System.Exception:无法在 OuterType+Model 类型中查找已翻译字段名称的 id 字段:名称、选定对象、ID

这让我相信转换器正在寻找通过字段名称匹配类型。所以我改变了我的代理如下:

[<Proxy(typeof<OuterType.Model>)>]
type ProxyModel =
    {
        id : string
        selected : bool
        name : string
    }

以上导致编译错误:

WebSharper 错误 FS9001:找不到 F# 记录类型的字段:OuterType.Model.Selected WebSharper 错误 FS9001:找不到 F# 记录类型的字段:OuterType.Model.Name

我被困住了。有什么我想念的吗?

更新:

该应用程序的目标是 netcoreapp2.1。它使用以下 WebSharper 依赖项(摘自我的 paket.lock):

WebSharper (4.5.9.330)
WebSharper.AspNetCore (4.5.3.104)
WebSharper.FSharp (4.5.9.330)
WebSharper.Html (4.5.1.153)
WebSharper.Reactive (4.5.1.139)
WebSharper.UI (4.5.8.161)
4

1 回答 1

0

WebSharper 远程处理使用反射来创建/读取对象,因此如果它们是类,它们必须遵循https://developers.websharper.com/docs/v4.x/cs/remoting#heading-6中的规则。

在这种情况下,您需要的唯一更改是公开无参数构造函数。

一旦你有了它,你可以将 C# 类型用于 RPC,但仍然用于客户端,你需要一个[JavaScript]类型(为 C# 项目添加了 WebSharper 和 WebSharper.CSharp 包),或者一个与之匹配的代理好吧,包括您无法使用 F# 记录重现的构造函数,您可能需要一个类。

于 2019-05-15T21:41:46.693 回答