2016-03-29 2 views
5

Код FSharp структурирован следующим образом (я не контролирую исходный код).Как называть расширения типа F (статические функции-члены) от 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# код вызова выглядит следующим образом

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

Почему бы просто не использовать отражатель, чтобы выяснить, что полное имя метода? ILSpy должен работать нормально :) – Luaan

+0

@ Luaan Даже зная полное имя недостаточно - C# не может использовать его напрямую. Сам вопрос на самом деле * показывает * полное имя в комментариях. –

+0

@ReedCopsey Это полезная информация, которая будет экономить OP много времени, конечно: P Немного постыдно, что C# не разрешает цитируемые идентификаторы ... для взаимодействия. – Luaan

ответ

7

Я не считаю, что метод может быть вызван непосредственно из C# без использования отражения, как скомпилирован имя метода не является допустимым именем метода в C# ,

С помощью отражения, вы можете вызвать его с помощью:

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

Уг. Я боялся, что это будет так. Это очень неудачно, поскольку упомянутый api - это PCL FSharp.Core reflection api. (FSharpValue.GetUnionFields) –

+2

@ KennethIto Yeah - они действительно предназначены только для использования с F #. Вы можете использовать '[]', чтобы использовать методы расширения, которые являются расходными материалами на C#, но этот вариант на самом деле никогда не предназначался для этих целей. –

+0

Ahh, я думаю, мне было бы намного меньше, если бы не было возможности работать с f # reflection из C#, если бы были f # общие проекты. Надеюсь, что-то происходит из этого https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/6429294-add-support-for-universal-apps-shared-projects –

Смежные вопросы