作为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吗?
答案 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"