我正在使用 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 “使用”。
当我使用记录时,我仍然对这种行为感到困惑。