2014-11-11 5 views
1

으로 변환 F #의 초보자로서 나는 일상적으로 C#의 비트를 학습용으로 변환하려고합니다. 이 경우 다음 C# 식 구문 분석 코드를 변환하려고합니다. 간단합니다. 표준 반사 기법을 사용하는 대신 속성 이름의 문자열 표현을 얻기 위해이 함수에 람다를 전달하는 것이 좋습니다. 다른 GetMemberName 함수를 생략했습니다. 일단 접근 방법에 대한 지침을 얻으면 알아낼 수있을 것 같습니다.C# 표현식 구문 분석을 F #

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 #에 인용문이 있습니다. 또한 F #에서 Linq 표현식을 사용할 수 있다는 것도 알고 있습니다. 인용문을 사용하여 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 표현식과 F # 인용문 모두 .Net 반사 유형에서 작동합니다. 두 경우 모두 텍스트 파싱이 필요하지 않습니다. – svick