3

HttpListener の Owin 実装からこのメソッドを使用したいと思います。

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

AppFunc には次のような署名があります。

IDictionnary<string,Object> -> Task

タスクを作成したかったのですが、アクションが必要で、F# でそれを行う方法がわかりませんでした。私がこれまでに管理した最善の方法は、この質問のコードを使用することでした:

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"))

program.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)

しかし、それは私に教えてくれます:この式は型アクションを持つことが期待されていましたが、ここには型デリゲートがあります

F# から C# コードにアクションを与える必要がありますか? または、アクションの代わりにデリゲートを待機するなど、f# にいくつかの機能を追加するために、c# コードで作業する必要がありますか?

私は自分の知識の限界をいじっていて、痛みを感じています. 確かに、私は多くのことを学ばなければなりませんが、最初のステップを登るのを手伝ってくれれば...

4

1 に答える 1

10

F# でデリゲートを作成するためにリフレクションを使用する必要はありません。CsharpActionコードの最初の部分 (モジュール)を完全に捨てることができます。

コードの 2 番目のチャンクについては、これを試してください。

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)
于 2013-09-14T13:54:32.263 に答える