Как получить имя F # модуля, функции и т. Д. Из соответствия выражений в кавычках

Я продолжаю работать над принтером для выражений в кавычках F #, это не так. не обязательно быть идеальным, но я бы хотел посмотреть, что возможно. Активные шаблоны в Microsoft.FSharp.Quotations.Patterns и Microsoft.FSharp.Quotations.DerivedPatterns , используемые для декомпозиции выражений в кавычках, обычно предоставляют экземпляры MemberInfo , когда это необходимо, их можно использовать для получения имени свойства, функции и т. д. и их «декларирующего» типа, такого как модуль или статический класс. Проблема в том, что я знаю только, как получить CompiledName из этих экземпляров, но мне нужно имя F #. Например,

> <@ List.mapi (fun i j -> i+j) [1;2;3] @> |> (function Call(_,mi,_) -> mi.DeclaringType.Name, mi.Name);;
val it : string * string = ("ListModule", "MapIndexed")

Как можно переписать это совпадение, чтобы вернуть («Список», «mapi») ? Возможно ли это?

К вашему сведению, вот мое последнее отполированное решение от Стрингера Белла и помощи pblasucci:

let moduleSourceName (declaringType:Type) =
    FSharpEntity.FromType(declaringType).DisplayName

let methodSourceName (mi:MemberInfo) =
    mi.GetCustomAttributes(true)
    |> Array.tryPick 
            (function
                | :? CompilationSourceNameAttribute as csna -> Some(csna)
                | _ -> None)
    |> (function | Some(csna) -> csna.SourceName | None -> mi.Name)

//usage:
let sourceNames =
    <@ List.mapi (fun i j -> i+j) [1;2;3] @> 
    |> (function Call(_,mi,_) -> mi.DeclaringType |> moduleSourceName, mi |> methodSourceName);
5
задан Stephen Swensen 7 January 2011 в 05:49
поделиться