Questo sarebbe molto semplice se fossi in grado di assegnare tramite un'espressione lambda (sotto)Come assegnare un valore tramite Expression?
//An expression tree cannot contain an assignment operator
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName = "Tim";
Questo codice è valido causa l'operatore di assegnazione. Devo passare un'espressione lambda per identificare la proprietà nell'oggetto complesso che deve essere impostato. In alcuni casi l'oggetto complesso ha List e quindi nomi e tipi di oggetti duplicati, motivo per cui ho bisogno che lambda faccia riferimento esplicitamente al campo nell'oggetto da aggiornare.
Sono in grado di recuperare il valore utilizzando il seguente, nessun problema. Ma non sono sicuro di come utilizzare questa stessa logica per impostare il valore, mi sono imbattuto in Expression.Assegna e credo che questa possa essere la soluzione.
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);
}
Aggiornamento:
"il superamento di un assegnazione di proprietà a un metodo come un albero di espressione ..."
Utilizzando il metodo SetValue con ParentTypeA, valore non funzionerà. (Di seguito Codice)
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);
}
http://stackoverflow.com/questions/5780232/assign-property-with-an-expressiontree –
questo sembra essere molto promettente Stan, grazie – AnxiousdeV