1

作为 F# 的新手,我经常尝试将 C# 的部分转换为学习练习。在这种情况下,我正在尝试转换以下 C# 表达式解析代码。很简单,想法是将 lambda 传递给此函数以获取属性名称的字符串表示,而不是使用标准反射技术。我已经省略了另一个 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吗?

4

1 回答 1

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"
于 2014-11-11T15:12:54.823 回答