Bunun nedeni atama operatöreİfade ile bir değer nasıl atanır? I (aşağıda) bir Lambda ifadesi yoluyla atamak mümkün olsaydı
//An expression tree cannot contain an assignment operator
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName = "Tim";
Bu kod yukarıdaki geçersiz çok basit olacaktır. Ayarlanması gereken karmaşık nesnede özelliği tanımlamak için bir lambda ifadesini geçmem gerekiyor. Bazı durumlarda, karmaşık nesnenin Listesi ve bunun için yinelenen nesne türleri ve adları vardır; bu nedenle, güncellenecek nesnede alanı açıkça referans vermek için lambdaya ihtiyacım vardır.
Aşağıdakileri kullanarak değeri alıyorum, sorun değil. Ama değeri ayarlamak için aynı mantığın nasıl kullanılacağından emin değilim, Expression.Assign ile karşılaştım ve bunun çözüm olabileceğine inanıyorum.
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);
}
Güncelleme:
ParentTypeA ile DeğerBelirle yöntemi kullanarak
"bir ifade ağacına ... gibi bir yönteme bir özellik ataması geçen" Değer çalışmayacaktır. (Aşağıdaki kodu)
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 –
bu Stan'i umut verici görünüyor , teşekkürler mevcut sınıf daha özelleştirilebilir olsaydı Jer, bu çalışacak – AnxiousdeV