>假设我在 F# 中定义了以下接口:
type IFoo<'T> =
abstract member DoStuff : 'T -> unit
如果我在 C# 中实现这一点,我需要方法签名是:
public void DoStuff<T>(T arg) {...}
我真正想做的是引用FSharp.Core,然后使用:
public Unit DoStuff<T>(T arg) {...}
这将简化其他代码,因为我不必处理操作与 Func。我猜没有任何干净的方法来实现这一目标?一些邪恶的黑客怎么样?
将Unit
转换为void
被烘焙到编译器中。F# Core 中有一个 FuncConvert
类,用于在 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
。