1

我正在使用 Flurl 调用 API。

//# models.fs
module models =

    type Ticker = { Ask :decimal; Bid :decimal; Last: decimal; High :decimal; Timestamp :int; } 

//# Client.fs
namespace MyLibrary
// ... some code
    url.GetJsonAsync<models.Ticker>()

这有效,我可以访问ticker.Ask 属性。

类 models.Ticker 在另一个 C# 项目中是可见的,并且构造函数是这样的:

public Ticker(decimal ask, decimal bid, decimal last, decimal high, int timestamp);

我不想公开模型模块和 Ticker 类/记录,所以我将可见性更改为internal

# models.fs
module internal models =

    type Ticker = { Ask :decimal; Bid :decimal; Last: decimal; High :decimal; Timestamp :int; } 

代码仍然“编译”但是当我运行它时我有这个异常:

  • Newtonsoft.Json.JsonSerializationException:找不到用于 MyProject.models+Ticker 类型的构造函数。一个类应该有一个默认构造函数、一个带参数的构造函数或一个标有 JsonConstructor 属性的构造函数。路径 'high',第 1 行,位置 8。在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject 的 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader reader,JsonObjectContract objectContract,JsonProperty containerMember,JsonProperty containerProperty,String id,Boolean& createdFromNonDefaultCreator) (JsonReader reader,Type objectType,JsonContract contract,JsonProperty member,JsonContainerContract containerContract,JsonProperty containerMember,Object existingValue)在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader。

在此处输入图像描述

这是完整的代码示例,我是 F# 新手,可能需要解释问题:

open Flurl.Http
// open mynamespace where is models

type IClient =
    abstract member GetAsk : decimal   

type MyClient() =

    let getTicker () = 
        let url = "https://www.bitstamp.net/api/v2/ticker/XRPUSD"
        url.GetJsonAsync<models.Ticker>()                

    interface IClient with
        member  __.GetAsk =         
            let ticker = getTicker().Result
            ticker.Ask 

我正在使用来自 C# 项目的客户端。我想 Ticker 的构造函数因为可见性而改变了。但为什么?如何保持 Ticker 类隐藏并使代码按预期工作?

[更新:使用类]
使用类

type internal Ticker(ask:decimal, bid :decimal, last: decimal, high :decimal, timestamp :int) =
    member this.Ask = ask    

按预期完成工作。如果是内部的,它在外部是不可见的,但它可以被 JsonDeserializer “使用”。
当我使用记录时,我仍然对这种行为感到困惑。

4

0 回答 0