Tag: f#

Json.NET根据属性类型使属性成为必需

我正在努力使用.Net核心中的自定义json序列化,我正在尝试默认所需的所有属性,除非属性具有特定类型。 这是我想要实现的一个例子: 让我们确定我有以下类型:F#: type FooType = { id: int name: string optional: int option } 你可以考虑下面的代码与C#中的类似: class FooType = { int Id {get;set;}; string Name {get;set;}; Nullable Optional {get;set;}; } 我想要做的是返回错误,如果json对象中缺少Id或Name属性,但如果缺少Optional,则反序列化而不会出现错误(因此基本上根据需要将属性设置为不需要)。 我可以使用此示例中的RequireObjectPropertiesContractResolver标记所有属性: https : RequireObjectPropertiesContractResolver但不幸的是我无法构建更具动态性的东西。 我还有我希望添加到序列化的可选类型的默认转换器。 它不是这个特定问题的一部分,但是如果您知道如何将属性标记为必需或在一个地方使用自定义转换器,那么它甚至可能更大。

如何使用mono解决OSX上的SecureChannelFailure问题

我正试图在单声道上使用.NET(F#)访问https://geocoder.cit.api.here.com 。 我正在使用FSharp.Data的Http帮助程序,使用以下代码: let baseUrl = “https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=1701%20McFarland%20Blvd%20E%20Tuscaloosa%09%20AL&app_id=&app_code=” let res = Http.RequestString(baseUrl) 在OSX Sierra(10.12.2)上以单声道版本4.6.2为我运行这个产生SecureChannelFailure 。 我该如何解决这个问题? 我试过mozroots –import –ask-remove但是没有帮助。 在~/.config/.mono/certs/Trust 。 我甚至试图绕过检查,因为我只是在调查API,但这也不起作用。 我试图绕过它的方式是: let callback = Security.RemoteCertificateValidationCallback(fun _ _ _ _ -> true) ServicePointManager.ServerCertificateValidationCallback <- callback

解决同时使用C#和F#的项目的循环引用

所以这是我的情况。 我在C#中有一个类库。 它公开了一些像Rectangle这样的类型。 它还公开了一些进行算法计算的方法。 在F#中编写这些算法位似乎是个好主意。 所以我在解决方案中添加了另一个F#库项目。 现在这是问题所在。 为了让F#项目进行算法计算,需要了解C#项目中的Rectangle 。 为了使C#项目能够使用F#函数,它需要引用F#项目。 所以有循环参考。 一种可能的解决方案是建立第三个项目,我可以在其中定义Rectangle ,然后从F#和C#引用该项目,然后从C#引用F#项目,这样我就可以使用这些函数了。 这个问题是我的库的用户不仅要引用我的C#项目,还要引用额外的第三个项目(因为使用需要为算法提供输入)。 这是不可接受的,因为使用F#只是一个实现细节,我不希望它在我的库使用方式上有任何开销。 所以我们假设Rectangle保留在C#项目中。 算法的F#实现(C#中调用函数的方法)的“接口”也在C#项目中。 如何将其全部链接以便它可以正常工作? 还有其他选择吗? 我拒绝循环引用似乎很奇怪。 像这样的紧密绑定的项目实际上没有有向图结构。 我知道有一个额外的方法。 F#项目有自己的Rectangle ,然后在两端进行序列化和反序列化。 这既乏味又与最初使用F#使我的代码更简单的想法相反。

如何将F#函数转换为非genericsSystem.Action?

就像标题一样。 我有一个现有的C#库,我必须使用F#interop访问它。 其中一个方法将非genericsSystem.Action委托作为参数。 如何将F#function(即unit->unit )转换为该委托? 尝试使用直接强制转换时,会发生以下错误: Multiple types exist called ‘Action’, taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, eg ‘Action’.

从F#中消耗C#事件

接下来的function反应式编程教程,其中事件流( Observable )直接从System.Timers.Timer.Elapsed事件创建。 let timer = new System.Timers.Timer(float 1) let observable = timer.Elapsed observable |> Observable.subscribe … 在C#定义class public delegate void OnMessageDelegate(Message message); public class Notifier : INotifier { public event OnMessageDelegate OnMessage; public void Notify(Message message) => OnMessage?.Invoke(message); } 将相应的Dll引用到F#项目中并尝试从Notifier.OnMessage事件创建Observable let Start (notifier : Namespace.Notifier) = notifier.OnMessage |> Observable.subscribe (fun ms -> … 0 […]

如何从C#调用F#类型扩展(静态成员函数)

FSharp代码结构如下(我不控制源代码)。 namespace FS [] type TestType() = static member IrrelevantFunction() = 0 [] module Extensions = type TestType with //How do we call this from C# static member NeedToCallThis() = 0 module Caller = let CallIt() = //F# can call it TestType.NeedToCallThis() C#调用代码如下 public void Caller() { TestType.IrrelevantFunction(); //We want to call this //TestType.NeedToCallThis(); //Metadata: […]

.NET DateTime以time_t为单位

有C代码: time1=((double)dt1-25569.0)*86400.0; 它在几秒钟内从TDateTime(VCL)转换为time_t格式,所以最后我需要从.NET DateTime获取time_t格式 关于time_t: 几乎普遍期望它是表示自UTC时间1970年1月1日00:00以来经过的秒数的积分值。 这是由于历史原因,因为它对应于unix时间戳,但是在所有平台的C库中广泛实现。 所以要在.NET中获得秒数我正在做这个(F#): let seconds(dt : DateTime) = (dt.Ticks/10000000L) 或者在C#上(使用更流行的C#标签): Int64 seonds(DateTime dt) { return (dt.Ticks/ ((Int64)10000000)); } // hope it works, but please correct if I mistaken 据我所知,它是从0001 UTC 1月1日12:00:00开始的时间。 因此,要使用time_t格式,我需要在几秒钟内添加1970年。 所以最终函数必须是(F#): let seconds(dt : DateTime) = (dt.Ticks/10000000L) + 31536000*1970 C# : Int64 seonds(DateTime dt) { return (dt.Ticks/ ((Int64)10000000)) […]

为什么Paket安装比Nuget更多的包?

为什么Paket默认安装比Nuget更多的包? 这是正常的行为还是我做错了什么? 我按照入门指南 (但在我通过choco install paket.powershell的帮助下): 我做了一个新的WPF项目 使用Paket-Init命令初始化Paket 在paket.dependencies文件中添加了nuget reactiveui 执行Paket-Install命令下载软件包 因此,我在packages文件夹中有以下内容: reactiveui reactiveui-core Rx-Core Rx-Interfaces Rx-Linq Rx-Main Rx-PlatformServices Rx-WindowStoreApps Rx-WinRT Rx-Xaml Splat System.Collections System.Diagnostics.Debug System.Diagnostics.Tools System.IO System.Linq System.Linq.Expressions System.ObjectModel System.Reflection System.Reflection.Extensions System.Runtime System.Runtime.Extensions System.Runtime.InteropServices.WindowsRuntime System.Runtime.Serialization.Primitives System.Runtime.Serialization.Xml System.Text.Encoding System.Threading System.Threading.Tasks 当使用VS Package Manager Console中基于nuget的标准Install-Package reactiveui activui时,我有: reactiveui-core.7.0.0 reactiveui.7.0.0 Rx-Core.2.2.5 Rx-Interfaces.2.2.5 Rx-Linq.2.2.5 Rx-Main.2.2.5 Rx-PlatformServices.2.2.5 Rx-XAML.2.2.5 Splat.1.6.0 […]

无法将C#PCL的引用添加到F#PCL(VS 2015 Update 1)

我在创建F#便携式项目时遇到问题,应该从C#便携式项目中引用。 添加此类引用时,将显示以下消息: 无法添加对’PortableLibrary1’的引用。 可移植库项目只能引用其他可移植库项目和程序集。 使用最新的Visual Studio 2015 Update 1(版本14.0.24720.00)可以轻松复制该问题。 我也安装了Xamarin。 我可以使用以下可用的任何C#便携式项目重现该问题: 类库(便携式) 类库(适用于iOS,Android和Windows) 以及任何类型的F#便携式库项目,具有以下可用: 可移植库(.NET 4.5,Windowsapp store,Silverlight 5,Xamarin)[配置文件47] 可移植库(.NET 4.5,Windowsapp store,Windows Phone 8 Silverlight,Xamarin)[配置文件78] 可移植库(.NET 4.5,Windowsapp store,Windows Phone 8.1,Windows Phone Silverlight 8,Xamarin)[Profile 259] 可移植库(.NET 4.5,Windowsapp store,Xamarin)[配置文件7] 我使用了与C#相同的配置文件和F#,没有任何帮助。 似乎之前已经存在这样的问题( 如何从C#可移植类库(PCL)添加对F#可移植库的引用 ),然后成功修复了该问题。 但它现在再次复制。 有人可以告诉我,我错过了什么吗? 也许还需要额外安装一些东西?

实现C#方法返回F#中的Task

我在F#中创建了一个inheritance自C#类的类型,该类公开了一个在C#中返回Task的方法。 我正在尝试找出在F#中做到这一点的最佳方式 说我的C#看起来像这样: public class Foo { public TextWriter Out { get { return Console.Out; } } public virtual Task DoStuff() { return Task.FromResult(SomeEnum.Foo); } } public enum SomeEnum { Foo, Bar } 我在F#中inheritance该类型的第一步看起来像这样: type Bar() = inherits Foo() override this.DoStuff() = this.Out.WriteLineAsync(“hey from F#”) |> ignore System.Threading.Task.FromResult(SomeEnum.Bar) 但是a)它不觉得它实际上是异步的并且b)它只是感觉不是-F#。 那么我将如何inheritanceFoo类并实现期望返回Task的DoStuff方法?