FSharp代码的结构如下(我不受源代码控制)。

namespace FS

[<AbstractClass; Sealed>]
type TestType() =
    static member IrrelevantFunction() =
        0

[<AutoOpen>]
module Extensions =
    type TestType with
        //How do we call this from C#
        static member NeedToCallThis() =
            0

module Caller =
    let CallIt() =
        //F# can call it
        TestType.NeedToCallThis()

C#调用代码如下
public void Caller()
{
    TestType.IrrelevantFunction();

    //We want to call this
    //TestType.NeedToCallThis();

    //Metadata:

    //namespace FS
    //{
    //    [Microsoft.FSharp.Core.AutoOpenAttribute]
    //    [Microsoft.FSharp.Core.CompilationMappingAttribute]
    //    public static class Extensions
    //    {
    //        public static int TestType.NeedToCallThis.Static();
    //    }
    //}

    //None of these compile
    //TestType.NeedToCallThis();
    //Extensions.TestType.NeedToCallThis.Static();
    //Extensions.TestType.NeedToCallThis();
}

最佳答案

我不认为可以在不使用反射的情况下直接从C#调用该方法,因为在C#中,已编译的方法名称不是有效的方法名称。

使用反射,您可以通过以下方式调用它:

var result = typeof(FS.Extensions).GetMethod("TestType.NeedToCallThis.Static").Invoke(null,null);

10-06 14:45