Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# F#OOP-实现接口-私有和方法名称问题_C#_.net_Interface_F#_Interop - Fatal编程技术网

C# F#OOP-实现接口-私有和方法名称问题

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-跑步应该是公开的,有

被一个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)