f# - 是否可以在 F# 中定义通用扩展方法?

标签 f# extension-methods

我试图将 Rhino Mocks 与 F# 代码一起使用,但以下代码存在问题:

let service = MockRepository.GenerateMock<IMyService>()
service.Stub(s => s.Name).Return("Service");

这并不奇怪,因为 Stub 不是 IMyService 接口(interface)的一部分,它是 Rhino Mocks 定义的 C# 扩展方法。

稍微修改的代码有效:
let service = MockRepository.GenerateMock<IMyService>()
RhinoMocksExtensions.Stub<IMyService, string>(service, fun s -> s.Name).Return("Service");

但是,在 F# 中定义一个扩展方法会很好,但是它将是一个参数化的通用扩展方法,它需要一个 tuple 。我正在尝试各种语法,但没有任何运气。我没有找到 F# 当前是否支持此功能的信息。如果有人知道,请告诉我。

最佳答案

正如 kvb 所提到的,这在 F# 2.0 中是不可能的。在这种特殊情况下,我将包装 Rhino.Mocks 流利的接口(interface)以使其在 F# 中更加惯用,例如:

let mstub f target =
    RhinoMocksExtensions.Stub(target, Function(f))

let mreturn value (options: IMethodOptions<'a>) =
    options.Return value

let service = MockRepository.GenerateMock<IComparer>()
service |> mstub (fun s -> s.Compare(1,2)) |> mreturn 1 |> ignore

What's fluent in one language is not necessarily fluent in another. (对不起插件,但我真的认为它在这里相关)

关于f# - 是否可以在 F# 中定义通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3381570/

相关文章:

c# - 同一命名空间中的类和扩展方法容器类。有什么好处?

F# 字符串运算符在 guid 上爆炸

f# - 如何在 F# 中使用 C# 可为空的日期时间

dictionary - 处理相同类型但不同形状的对象的惯用方法是什么?

json - FSharp.Data——如何处理空 JSON 值?

azure - 使用 F# 在 Azure 辅助角色中托管 SignalR 时出现 FileLoadException

c# - 接口(interface)扩展方法,具有匹配的通用参数

asp.net - 如何在数据绑定(bind)控件中使用 Eval 调用扩展方法

c# - 扩展方法冲突

c# - ICollection/ICollection<T> 歧义问题