F#内部可见性更改记录构造函数的行为

时间:2019-01-13 14:13:02

标签: f# json.net flurl class-visibility

我正在使用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属性。

类模型。代码从另一个C#项目中可见,其构造是这样的:

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

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

# models.fs
module internal models =

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

代码仍然可以“编译”,但是当我运行它时,我会遇到以下异常:

  • Newtonsoft.Json.JsonSerializationException:无法找到用于类型MyProject.models + Ticker的构造函数。一个类应该具有一个默认构造函数,一个带有参数的构造函数或一个标有JsonConstructor属性的构造函数。路径“高”,第1行,位置8。 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader Reader,JsonObjectContract objectContract,JsonProperty containerMember,JsonProperty containerProperty,String id,Boolean&createdFromNonDefaultCreator)中 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader阅读器,Type objectType,JsonContract合同,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerMember,对象existValue)中 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,Type objectType,Boolean checkAdditionalContent)中 在Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType) 在Newtonsoft.Json.JsonSerializer.Deserialize [T](JsonReader reader) 在Flurl.Http.Configuration.NewtonsoftJsonSerializer.Deserialize [T](Stream stream) 在Flurl.Http.HttpResponseMessageExtensions.ReceiveJson [T](任务1响应)} System.Exception {Newtonsoft.Json.JsonSerializationException} *

enter image description here

这是完整的代码示例,我是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    

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

0 个答案:

没有答案