gpt4 book ai didi

c# - 在 F# 中创建一个操作以使用 c# 方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:35 25 4
gpt4 key购买 nike

我想使用 HttpListener 的 Owin 实现中的这个方法:

public static IDisposable Create(AppFunc app, IDictionary<string, object> properties)

AppFunc 有这样的签名:

IDictionnary<string,Object> -> Task

我想创建一个任务,但它需要一个 Action ,而且我不知道如何在 F# 中完成它。到目前为止,我做到最好的是使用此 question 中的代码:

module CsharpAction

open System

type Wrapper<'T>(f:'T -> unit) =
member x.Invoke(a:'T) = f a

let makeAction (typ:Type) (f:'T -> unit) =
let actionType = typedefof<Action<_>>.MakeGenericType(typ)
let wrapperType = typedefof<Wrapper<_>>.MakeGenericType(typ)
let wrapped = Wrapper<_>(f)
Delegate.CreateDelegate(actionType, wrapped, wrapped.GetType().GetMethod("Invoke"))

程序.fs

let yymmdd1 (date:DateTime) = date.ToString("yy.MM.dd")
let printSuccess = fun() -> printfn "Success %s" (yymmdd1 DateTime.Now )
let actionTask = CsharpAction.makeAction (typeof<string>) (printSuccess)
let mutable properties = Dictionary(dict [("fooKey", new Object())])


let server = OwinServerFactory.Create((fun (props) -> new Task(actionTask)) , properties)

然后它告诉我:这个表达式应该有类型 action 但这里有类型 delegate

我应该从 F# 向 C# 代码提供一个 Action 吗?或者我应该处理 c# 代码以便为 f# 提供一些细节,例如等待委托(delegate)而不是操作?

我正在挑战我知识的局限,我确实感到痛苦。很确定,我将不得不学习很多东西,但如果你愿意帮助我爬上第一步......

最佳答案

您不需要使用反射在 F# 中创建委托(delegate)。您可以完全放弃代码的第一部分(您的 CsharpAction 模块)。

至于第二段代码,试试这个:

open System
open System.Collections.Generic
open System.Threading.Tasks

let yymmdd1 (date : DateTime) = date.ToString "yy.MM.dd"
let printSuccess () = printfn "Success %s" (yymmdd1 DateTime.Now)

let server =
let actionTask = Action printSuccess
let properties = Dictionary (dict ["fooKey", obj ()])
OwinServerFactory.Create((fun props -> new Task (actionTask)), properties)

关于c# - 在 F# 中创建一个操作以使用 c# 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com