c# - Why this Lambda Expression is casted as MemberExpression and UnaryExpression? -


i new c# , lambda expressions; in this tutorial cannot understand code lambda expression:

public viewmodel() {     base.addrule(() => aid, () =>     aid.length >= (5 * 2) &&     aid.length <= (16 * 2) &&     aid.length % 2 == 0, "invalid aid."); } 

and addrule method tutorial says adds rule rule dictionary:

public void addrule<t>(expression<func<t>> expression, func<bool> ruledelegate, string errormessage) {     var name = getpropertyname(expression);      rulemap.add(name, new binder(ruledelegate, errormessage)); } 

and

protected static string getpropertyname<t>(expression<func<t>> expression)         {             if (expression == null)                 throw new argumentnullexception("expression");              expression body = expression.body;             memberexpression memberexpression = body memberexpression;             if (memberexpression == null)             {                 memberexpression = (memberexpression)((unaryexpression)body).operand;             }             return memberexpression.member.name;         }      } 

what () => aid mean , why addrule receives , cast unaryexpression , memberexpression ?

() => aid shorthand () => { return aid; }, returns property (or field - didn't show declaration). results in anonymous function.

but because addrule method takes expression<func<t>> instead of func<t>, compiler creates instructions create ast (abstract syntax tree) instead of anonymous function. ast can compiled method, here it's used extract name of property/field.

the alternative pass property name string. advantage of using member expression it's refactor-friendly: renaming property update code, ensuring rule still associated right property.

this being passed addrule (you can manually, you'd lose refactor-friendly benefit - besides, () => aid lot more concise):

expression.lambda<func<t>>(     expression.property(         expression.constant(this),         "aid")); 

Comments