5

F# で次のインターフェイスを定義したとします。

type IFoo<'T> = 
  abstract member DoStuff : 'T -> unit

これを C# で実装する場合、メソッド シグネチャを次のようにする必要があります。

public void DoStuff<T>(T arg) {...}

私が本当にやりたいことは、FSharp.Core を参照してから使用することです。

public Unit DoStuff<T>(T arg) {...}

これにより、Action と Func を扱う必要がなくなるため、他のコードが簡素化されます。これを達成するためのきれいな方法はないと思いますか?邪悪なハックはどうですか?

4

1 に答える 1

6

Unittoの変換はvoidコンパイラに組み込まれます。FuncConvertF#Coreには、との間で変換するためのクラスがFSharpFuncありConverterます。Action<T>変換する同様のクラスを定義するのはどうFunc<T, Unit>ですか?

static class ActionConvert {
    private static readonly Unit Unit = MakeUnit();

    public static Func<T, Unit> ToFunc<T>(Action<T> action) {
        return new Func<T, Unit>(x => { action(x); return Unit; });
    }

    private static Unit MakeUnit() {
        //using reflection because ctor is internal
        return (Unit)Activator.CreateInstance(typeof(Unit), true);
    }
}

その後、あなたはすることができます

var foo = new Foo<int>();
var func = ActionConvert.ToFunc<int>(foo.DoStuff);

おそらく、Unitインスタンスを放棄して、null代わりに戻ることもできます。

于 2012-12-18T15:45:15.500 に答える