It would be very simple if I could assign through a Lambda expression (below)
This code above is not valid due to the assignment operator. I need to pass a lambda expression to define a property in a complex object that needs to be set. In some cases, a complex object has a List and therefore duplicates the types and names of objects, so I need a lambda to explicitly refer to a field in the updated object.
I can get the value using the following, no problem. But I'm not sure how to use the same logic to set the value, I came across Expression.Assign and I think that this may be the solution.
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName; var result = FindByProperty(expression); public static string FindByProperty(Expression<Func<Contract, object>> propertyRefExpr) { ComplexObj obj = new ComplexObj(); Contact myContact = new Contact(); myContact.FirstName = "Allen"; obj.Contacts = new List<Contact>{myContact}; return propertyRefExpr.Compile().Invoke(obj); }
Update:
"passing property assignment to a method as an expression tree ..."
Using the SetValue method with ParentTypeA, the value will not work. (below code)
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName; obj.AssignNewValue(expression, firstName); public static void AssignNewValue(this ComplexObj obj, Expression<Func<ComplexObj, object>> expression, object value) { var propertyInfo = (PropertyInfo)((MemberExpression)expression.Body).Member; propertyInfo.SetValue(obj, value, null); }
AnxiousdeV
source share