我是 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 ?
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)