将C#表达式解析转换为F#

时间:2014-11-11 13:43:39

标签: linq f# linq-expressions quotations

作为F#的新手,我经常尝试将C#的比特转换为学习练习。在这种情况下,我试图转换以下C#表达式解析代码。很简单,想法是将lambda传递给this函数以获取属性名称的字符串表示,而不是使用标准反射技术。我已经省略了其他的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#有引文。我也知道我可以在F#中使用Linq表达式。我想首先使用引号尝试F#方式,但我感到磕磕绊绊。有人可以给我一个kickstart吗?

1 个答案:

答案 0 :(得分: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"