Преобразование синтаксического анализа выражений C# в F#

Будучи новичком в F#, я регулярно пытаюсь преобразовать биты C# в качестве учебного упражнения. В этом случае я пытаюсь преобразовать следующий код синтаксического анализа выражения C#. Это просто, идея состоит в том, чтобы передать лямбду в эту функцию, чтобы получить строковое представление имени свойства, а не использовать стандартные методы отражения. Я пропустил другую функцию GetMemberName, так как думаю, что смогу понять ее, как только получу рекомендации о том, какой подход выбрать.

public static string GetMemberName<T>(Expression<Func<T, object>> expression)
{
    if (expression == null)
    {
        throw new ArgumentException("The expression cannot be null.");
    }
    return GetMemberName(expression.Body);
}

Я знаю, что в F# есть кавычки. Я также знаю, что мог бы использовать выражения Linq в F#. Я хотел бы сначала попробовать использовать F #, используя цитаты, но я спотыкаюсь. Может ли кто-нибудь дать мне кикстарт?


person bp123    schedule 11.11.2014    source источник


Ответы (1)


Я не уверен, возможен ли точный перевод этого с помощью кавычек, потому что кавычки имеют форму, отличную от выражений C#. Впрочем, вот что-то в том же духе:

open Microsoft.FSharp.Quotations.Patterns

let GetMemberName = function
    | Call (_,methodInfo,_) -> methodInfo.Name
    | PropertyGet (_,propertyInfo,_) -> propertyInfo.Name
    | _ -> failwith "Not a member expression"

GetMemberName <@ [].IsEmpty @>
// val it : string = "IsEmpty"
person Daniel    schedule 11.11.2014
comment
Хорошо, но разве это не просто регулярное отражение, а не синтаксический анализ выражений? - person bp123; 11.11.2014
comment
Я не уверен, что разделяю различие, которое вы проводите. Я добавил пример использования в ответ. Надеюсь, это поможет прояснить. - person Daniel; 11.11.2014
comment
@ bp123 И выражения LINQ, и цитаты F # работают с типами отражения .Net. Ни в том, ни в другом случае разбора текста нет (вы это имели в виду?). - person svick; 11.11.2014
comment
Попался - это из-за моего невежества, извиняюсь. Я думал, что синтаксический анализ выражения на С# для целей функции, подобной той, которую я опубликовал, отличается от отражения. - person bp123; 11.11.2014