2016-03-29 19 views
5

FSharp-Code ist wie folgt strukturiert (ich habe nicht die Kontrolle über die Quelle).So rufen Sie F # -Typ-Erweiterungen (statische Elementfunktionen) von C#

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# Aufruf-Code ist als

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(); 
} 
+0

Warum nicht einfach einen Reflektor verwenden, um herauszufinden, was der volle Name der Methode ist? ILSpy sollte gut funktionieren :) – Luaan

+0

@Luaan Selbst wenn man den vollen Namen kennt, ist das nicht genug - C# kann es nicht direkt benutzen. Die Frage selbst * zeigt * den vollständigen Namen in den Kommentaren. –

+0

@ReedCopsey Das ist eine nützliche Information, die dem OP natürlich viel Zeit ersparen wird: P Es ist ein bisschen schade, dass C# keine in Anführungszeichen gesetzten Bezeichner erlaubt ... für Interop. – Luaan

Antwort

7

folgt kann ich glaube nicht, dass das Verfahren ohne Reflexion direkt von C# aufgerufen werden, wie die kompilierte Methodenname Name in C# keine gültige Methode ist .

Reflexion verwenden, können Sie es über nennen:

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

Ug. Ich hatte Angst, das wäre der Fall. Es ist wirklich bedauerlich, da die besagte API eine PCL FSharp.Core Reflection API ist. (FSharpValue.GetUnionFields) –

+2

@KennethIto Ja - sie sind eigentlich nur für die Verwendung von F # gedacht. Sie können '[]' 'verwenden, um Erweiterungsmethoden zu erstellen, die C# konsumierbar sind, die jedoch für diese Zwecke nicht wirklich gedacht waren. –

+0

Ahh, ich denke, ich würde mich viel weniger darum kümmern, nicht mit f # reflection von C# arbeiten zu können, wenn es f # geteilte Projekte gäbe. Hoffentlich kommt etwas von diesem https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/6429294-add-support-for-universal-apps-shared-projects –