将C#对象方法链接转换为F#

本文关键字:转换 链接 方法 对象 | 更新日期: 2023-09-27 18:25:46

这个问题很傻,但我似乎找不到正确的术语,所以我所有的搜索都失败了。

我有以下C#方法调用链:

container.Register(Component.For<IMyInterface>().ImplementedBy<MyClass>().Named("MyInstance").LifeStyleSingleton);

我如何在F#中写同样的内容?

我可以做到:

let f0 = Component.For<IMyInterface> () in
let f1 = f0.ImplementedBy<MyClass> () in
let f2 = f1.Named "MyInstance" in
let f3 = f2.LifestyleSingleton () in
ignore (container.Register f3)

但肯定还有其他更好的方式来构建这样一个呼叫。不

添加

早期的答案让我找到了一个有效的解决方案(我删除了所有提到ignore的内容,因为它无关紧要,只会让读者感到困惑):

container.Register (Component.For<IMyInterface>().ImplementedBy<MyClass>().Named("MyInstance").LifestyleSingleton())

然而,有一个回复说这应该有效:

container.Register <| Component.For<IMyInterface>().ImplementedBy<MyClass>().Named("MyInstance").LifestyleSingleton()

但事实并非如此。后一部分,<|之后的表达式,生成类型错误

此表达式应具有类型unit,但此处具有类型ComponentRegistration<IMyInterface>。

将C#对象方法链接转换为F#

您可以在F#中做几乎相同的事情:

container.Register <|
    Component
        .For<IMyInterface>()
        .ImplementedBy<MyClass>()
        .Named("My Instance")
        .LifeStyleSingleton()

这里添加了一些糖(<|)。你可以把调用放在一行上,或者像我刚才做的那样(我更喜欢这样,因为它很好地反映了F#流水线)。需要记住的一点是,参数需要加括号,函数名和parens之间不能有空格(相当于"C#风格")。