2016-03-29 15 views
7

Tôi đang trong một dự án chia sẻ C# cố gắng tìm PCL (Hồ sơ 259) tương đương với FSharpValue.GetUnionFields.Làm thế nào để đạt được `FSharpValue.GetUnionFields` trong C# PCL (Hồ sơ 259)

Trong trình duyệt đối tượng thông qua C# dự án, tôi thấy

namespace Microsoft.FSharp.Reflection 
{ 
    [AutoOpen] 
    [CompilationMapping(SourceConstructFlags.Module)] 
    public static class FSharpReflectionExtensions 
    { 
     public static Tuple<UnionCaseInfo, object[]> FSharpValue.GetUnionFields.Static(object value, Type unionType, [OptionalArgument] FSharpOption<bool> allowAccessToPrivateRepresentation); 
    } 
} 

này dường như là những gì tôi đang tìm kiếm, nhưng tôi không thể (hoặc không biết làm thế nào) để gọi nó từ C# . Qua F #, nếu tôi mở không gian tên, tôi có thể gọi số máy lẻ FSharpValue.GetUnionFields. FSharpValue.GetUnionFields không biên dịch từ C# PCL. Tôi không có kinh nghiệm với F # vì vậy nó có thể là tôi chỉ thiếu một số phần quan trọng của kiến ​​thức liên quan đến F # - C# interop?

Để tham khảo, đây là những gì tôi thấy từ F # pcl.

[<AutoOpen>] 
module Microsoft.FSharp.Reflection.FSharpReflectionExtensions 
open Microsoft.FSharp.Reflection 

val GetUnionFields : value:obj * unionType:System.Type * ?allowAccessToPrivateRepresentation:bool -> UnionCaseInfo * obj [] 

dự án Repro đây: https://github.com/kennethito/StackOverflowReferences/tree/master/FSharpValue-GetUnionFields

+1

Khi bạn nói "không ai trong số các công việc sau đây", điều đó có nghĩa là gì? Điều gì sẽ xảy ra khi bạn cố gắng làm điều đó? –

+0

Tôi không thể nhận bất kỳ cuộc gọi nào liên quan đến GetUnionCases để biên dịch từ dự án C#. Tất cả chúng đều liệt kê các lỗi liên quan đến [Loại] không chứa khai báo cho [Phương pháp]. Về cơ bản tôi chỉ không biết làm thế nào để đúng cách gọi phần mở rộng từ C# –

+0

Vâng, bạn có thể sử dụng 'FSharpValue.GetUnionFields' để gọi nó ... – Ringil

Trả lời

2

Một lần nữa, điều này đòi hỏi sử dụng phản ánh. Vì nó là một PCL, nó đặc biệt khó chịu, như phiên bản thực tế của FSharp.Core nạp lúc chạy là một trong đó sẽ là vấn đề.

Sau đây nên làm việc:

public static Tuple<UnionCaseInfo, object[]> TestIt() 
{ 
    var option = new FSharpOption<int>(123); 

    MethodInfo method; 
    try 
    { 
     // If "4.4.0.0" is loaded at runtime, get directly 
     var t = typeof(FSharpValue); 
     method = t.GetRuntimeMethods().First(mi => mi.Name == "GetUnionFields"); 
    } 
    catch 
    { 
     var t = typeof(FSharpReflectionExtensions); 
     method = t.GetRuntimeMethods().First(mi => mi.Name == "FSharp.Value.GetUnionFields.Static"); 
    } 
    return (Tuple<UnionCaseInfo, object[]>)method.Invoke(null, new object[] { option, option.GetType(), null }); 
} 

này cố gắng tìm phương pháp trực tiếp trên các loại (làm thế nào nó được quy định tại FSharp.Core 4.4), và rơi trở lại cấu trúc PCL (như là một phương pháp mở rộng) .

C# console ứng dụng sau đây cho thấy nó làm việc:

static void Main(string[] args) 
{ 
    Tuple<UnionCaseInfo, object[]> results = CsharpPortable.Test.TestIt(); 
    var uci = results.Item1; 
    Console.WriteLine("{0}:", uci.Name); 
    foreach (var pi in uci.GetFields()) 
    { 
     Console.WriteLine("Property: {0}", pi.Name); 
    } 
    Console.ReadKey(); 
} 
Các vấn đề liên quan