C# F#OOP-实现接口-私有和方法名称问题
被一个OOP接口F#问题难住了 示例-当我创建一个类并尝试从名称空间中实现单个方法运行(string、string、string)时,示例来自接口IRunner 我可以在.NET Reflector中看到,真正创建的是一个名为Example IRunner Run(string,string,string)的私有方法,如果我想将其公开给一个C#lib,则会出现问题。通过反射——我无法控制的代码只是寻找一个具有公共运行方法的类。我该如何解决?似乎找不到有关此的任何文档 问题1-跑步应该是公开的,有些怎么会变成私人的C# F#OOP-实现接口-私有和方法名称问题,c#,.net,interface,f#,interop,C#,.net,Interface,F#,Interop,被一个OOP接口F#问题难住了 示例-当我创建一个类并尝试从名称空间中实现单个方法运行(string、string、string)时,示例来自接口IRunner 我可以在.NET Reflector中看到,真正创建的是一个名为Example IRunner Run(string,string,string)的私有方法,如果我想将其公开给一个C#lib,则会出现问题。通过反射——我无法控制的代码只是寻找一个具有公共运行方法的类。我该如何解决?似乎找不到有关此的任何文档 问题1-跑步应该是公开的,有
问题2-疯狂的长方法名-而不是只运行 不确定我是否需要使用一些修改器关键字或签名文件。。。。不仅仅是从(1)private和(2)奇怪的方法名开始(反射找不到) 注意:在本例中,Run返回一个int
在这个当前的实现中,我只是尝试返回一个1到“概念证明”,我可以用F#做这个简单的事情 示例代码:
namespace MyRunnerLib
open Example
type MyRunner() = class
interface IRunner with
member this.Run(s1, s2, s3) = 1
end
在google上快速搜索并获得第一个结果:
欣快回答中的第一个链接包含解决方案。作为参考,我将在这里重申。您需要使用感兴趣的方法在类上实现转发成员。这是因为接口是在F#中显式实现的,而在C#中默认为隐式接口实现。就你而言:
namespace MyRunnerLib
open Example
type MyRunner() = class
interface IRunner with
member this.Run(s1, s2, s3) = 1
member this.Run(s1, s2, s3) = (this :> IRunner).Run(s1,s2,s3)
end
此外,还有几个选项可以选择如何编写。Robert的版本在附加成员中有实际实现。如果将实现放在接口中,可以避免强制转换。
(还要注意,您不需要
类
。结束
关键字):
更清晰的方法是将功能定义为本地函数,然后只导出两次:
type MyRunner() =
// Implement functionality as loal members
let run (a, b, c) = 1
// Export all functionality as interface & members
member this.Run(a,b,c) = run (a, b, c)
interface IRunner with
member this.Run(a,b,c) = run (a, b, c)
type MyRunner() =
// Implement functionality as loal members
let run (a, b, c) = 1
// Export all functionality as interface & members
member this.Run(a,b,c) = run (a, b, c)
interface IRunner with
member this.Run(a,b,c) = run (a, b, c)