LambdaExpression构造函数

时间:2015-07-03 13:43:52

标签: c# linq expression

我看到了如下代码。我的问题是:

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;
    }
}

2 个答案:

答案 0 :(得分:5)

  1. 这是一个不带参数的lambda,但会产生String
  2. 否。 TDelegate是模板参数。 Func<T>是满足TDelegate约束的具体类型。 C#编译器将在编译时将lambda转换为适当的类型。
  3. 你应该测量以回答这个问题。

答案 1 :(得分:3)

所以()=>Name是一个lambda函数。它基本上是一个返回Name属性的函数。在你的情况下,这个东西是Func<string>的类型。

所有这一切都有所改变,因为您将其移交给定义为Expression<Func<T>>的字段。在您的情况下,您提供Expression<Func<string>>。基本上,这使lambda函数成为lambda函数的表达式,它不是函数的结果,而是结构。

通常使用这样的结构以安全的方式获取属性的名称。例如,防止混淆器或意外重命名使代码混乱。