我看到了如下代码。我的问题是:
1> ()=>Name
这是什么意思?
2 - ; Expression<Func<>>
与Expression<TDelegate>
相同吗? ()=>Name
如何转换为Expression<Func<>>
以及使用哪个构造函数?大多数Expression类都没有公共构造函数。 C#编译器如何从Lambda转换为Expression?
3&GT; Parse函数的性能成本是多少?
public class Test
{
public string Name {get;set;}
public void Start()
{
Parse(()=>Name);
}
public string Parse<T>(Expression<Func<T>> exp)
{
var mexp = (System.Linq.Expressions.MemberExpression)expression.Body;
return mexp == null ? "" : mexp.Member.Name;
}
}
答案 0 :(得分:5)
String
。TDelegate
是模板参数。 Func<T>
是满足TDelegate
约束的具体类型。 C#编译器将在编译时将lambda转换为适当的类型。答案 1 :(得分:3)
所以()=>Name
是一个lambda函数。它基本上是一个返回Name
属性的函数。在你的情况下,这个东西是Func<string>
的类型。
所有这一切都有所改变,因为您将其移交给定义为Expression<Func<T>>
的字段。在您的情况下,您提供Expression<Func<string>>
。基本上,这使lambda函数成为lambda函数的表达式,它不是函数的结果,而是结构。
通常使用这样的结构以安全的方式获取属性的名称。例如,防止混淆器或意外重命名使代码混乱。