2014-11-11 7 views
1

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

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 #, используя цитаты, но я спотыкаюсь. Может ли кто-нибудь дать мне кикстарт?

ответ

3

Я не уверен, что точный перевод этого возможно с помощью цитат, потому что цитаты имеют другую форму, чем выражения 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" 
+0

ОК, но разве это не просто регулярное отражение, а выражение синтаксического разбора? – bp123

+0

Я не уверен, что слежу за тем отличием, которое вы делаете. Я добавил пример использования ответа. Надеюсь, это поможет прояснить ситуацию. – Daniel

+0

@ bp123 И выражения LINQ Express, и F # работают с типами отражения .Net. Нет текстового разбора (это то, что вы имели в виду?) В любом случае. – svick

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

  • Нет связанных вопросов^_^