Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How set value a property selector Expression<Func<T,TResult>>

i need associate a entity property Address in my Person class entity with expressions linq in my FactoryEntities class using pattern factory idea, look this is what I have and I want to do:

Address address = new Address(); address.Country = "Chile"; address.City = "Santiago"; address.ZipCode = "43532"; //Factory instance creation object //This is idea Person person = new FactoryEntity<Person>().AssociateWithEntity(p=>p.Address, address);  public class Person: Entity {     public string Name{ get; set; }     public string LastName{ get; set; }     public Address Address{ get; set; } }  public class Address: Entity {     public string Country{ get; set; }     public string City{ get; set; }     public string ZipCode{ get; set; } }  public class FactoryEntity<TEntity> where TEntity : Entity {     public void AssociateWithEntity<TProperty>(Expression<Func<TEntity, TProperty>> entityExpression, TProperty newValueEntity) where TProperty : Entity     {         if (instanceEntity == null || instanceEntity.IsTransient())             throw new ArgumentNullException();          /*TODO: Logic the association and validation          How set the newValueEntity into the property of entityExpression (x=>x.Direccion = direccion*/     } } 
like image 942
Emilio Montes Avatar asked Nov 12 '11 19:11

Emilio Montes


1 Answers

This works:

The following helper method converts a getter expression into a setter delegate. If you want to return an Expression<Action<T,TProperty>> instead of an Action<T,TProperty>, just don't call the Compile() method at the end.

Note: The code is from Ian Mercer's blog: http://blog.abodit.com/2011/09/convert-a-property-getter-to-a-setter/

    /// <summary>     /// Convert a lambda expression for a getter into a setter     /// </summary>     public static Action<T, TProperty> GetSetter<T, TProperty>(Expression<Func<T, TProperty>> expression)     {         var memberExpression = (MemberExpression)expression.Body;         var property = (PropertyInfo)memberExpression.Member;         var setMethod = property.GetSetMethod();          var parameterT = Expression.Parameter(typeof(T), "x");         var parameterTProperty = Expression.Parameter(typeof(TProperty), "y");          var newExpression =             Expression.Lambda<Action<T, TProperty>>(                 Expression.Call(parameterT, setMethod, parameterTProperty),                 parameterT,                 parameterTProperty             );          return newExpression.Compile();     } 
like image 138
smartcaveman Avatar answered Sep 28 '22 19:09

smartcaveman