Nu odată ne-am lovit de acesta problema. Cum sa transmit numele unei proprietăți ca si string, fara sa fiu obligat in cazul unei redenumiri sa nu trebuiasca sa caut prin tot codul.
O solutie este crearea unei clase de mapare, dar aceasta trebuie sa fie tot timpul adusa la zi. O alta solutie este sa folosim reflection. Putem sa ne cream un helper care sa rezolve problema, dar lucrurile se complica cand vrem rezultatul sa fie sub forma: "proprietateParinte.proprietateCopil".
Cei care folosesc MVC stiu ca acesta vine in ajutorul programatorilor cu ExpressionHelper.GetExpressionText(exprisieLambda). Acesta metoda este des folosita cand se lucreaza cu ViewModel. Dar ce ne facem daca nu suntem intr-o aplicatie ASP.NET MVC?
O solutie este sa luam expresia lambda si sa o descompunem. Prin acest mecanism putem sa iteram prin fiecare parte din expresie. Prin intermediul propietatii Body putem sa obtinem body-ul expresiei, iar in functie de tipul expresiei putem sa stim pe ce pozitie ne aflam.
O solutie este crearea unei clase de mapare, dar aceasta trebuie sa fie tot timpul adusa la zi. O alta solutie este sa folosim reflection. Putem sa ne cream un helper care sa rezolve problema, dar lucrurile se complica cand vrem rezultatul sa fie sub forma: "proprietateParinte.proprietateCopil".
Cei care folosesc MVC stiu ca acesta vine in ajutorul programatorilor cu ExpressionHelper.GetExpressionText(exprisieLambda). Acesta metoda este des folosita cand se lucreaza cu ViewModel. Dar ce ne facem daca nu suntem intr-o aplicatie ASP.NET MVC?
O solutie este sa luam expresia lambda si sa o descompunem. Prin acest mecanism putem sa iteram prin fiecare parte din expresie. Prin intermediul propietatii Body putem sa obtinem body-ul expresiei, iar in functie de tipul expresiei putem sa stim pe ce pozitie ne aflam.
public class PropertyNameHelper
{
private const string Delimiter = ".";
public static string For<T>(Expression<Func<T, object>> expression)
where T:class
{
var body = expression.Body;
return GetPropertyName(body);
}
pprivate static string GetPropertyName(Expression expression)
{
if (expression is MemberExpression)
{
var memberExp = (MemberExpression)expression;
return memberExp.Expression.NodeType == ExpressionType.MemberAccess
? string.Format("{0}{1}{2}",GetPropertyName(memberExp.Expression),Delimiter,memberExp.Member.Name)
: memberExp.Member.Name;
}
if (expression is UnaryExpression)
{
var unaryExp = (UnaryExpression)expression;
if (unaryExp.NodeType == ExpressionType.Convert)
{
return GetPropertyName(unaryExp.Operand);
}
throw new Exception(string.Format("The member {0} cannot be found.", expression));
}
throw new Exception(string.Format("The member {0} could not been determined.", expression));
}
}
Putem sa obținem numele la proprietate astfel:PropertyNameHelper.For<Page>(s => s.Cache.Count);
Comments
Post a Comment