Skip to main content

Cum sa obtinem numele unei proprietati folosind lambda expression

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.
    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

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…