为什么这个 Lambda 表达式被转换为 MemberExpression 和 UnaryExpression?

Sae*_*eid 0 c# lambda

我是 C# 和 lambda 表达式的新手;在教程中,我无法理解代码对这个 Lambda 表达式的作用:

public ViewModel()
{
    base.AddRule(() => Aid, () =>
    Aid.Length >= (5 * 2) &&
    Aid.Length <= (16 * 2) &&
    Aid.Length % 2 == 0, "Invalid AID.");
}
Run Code Online (Sandbox Code Playgroud)

这是AddRule教程所说的将规则添加到规则字典中的方法:

public void AddRule<T>(Expression<Func<T>> expression, Func<bool> ruleDelegate, string errorMessage)
{
    var name = GetPropertyName(expression);

    ruleMap.Add(name, new Binder(ruleDelegate, errorMessage));
}
Run Code Online (Sandbox Code Playgroud)

protected static string GetPropertyName<T>(Expression<Func<T>> expression)
        {
            if (expression == null)
                throw new ArgumentNullException("expression");

            Expression body = expression.Body;
            MemberExpression memberExpression = body as MemberExpression;
            if (memberExpression == null)
            {
                memberExpression = (MemberExpression)((UnaryExpression)body).Operand;
            }
            return memberExpression.Member.Name;
        }

    }
Run Code Online (Sandbox Code Playgroud)

这是什么() => Aid意思以及为什么addrule接收它并将其转换为 UnaryExpression 和 MemberExpression ?

Jef*_*eff 5

MemberExpression 是实例上的表达式或 MemberInfo 的静态表达式。

UnaryExpression 是围绕目标和单个运算符的表达式(请参阅术语一元的定义)。这种运算符的一个很好的例子是强制转换。另一种是对值类型进行装箱或取消装箱的操作。

那么为什么获取 MemberInfo 的示例需要处理 UnaryExpression 呢?

考虑

public class Foo
{
    public String RefType { get; set; }
    public int ValueType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和一些代码

Expression<Func<Foo, object>> getter;
getter = f => f.RefType // compiler emits MemberExpression for RefType on a Foo instance
getter = f => f.ValueType // compiler emits an UnaryExpression to Box a MemberExpression for ValueType on a Foo instance.
Run Code Online (Sandbox Code Playgroud)