ラムダ式 (以下) を介して割り当てることができれば、これは非常に簡単です。
//An expression tree cannot contain an assignment operator
Expression<Func<ComplexObj, object>> expression = obj => obj.Contacts[0].FirstName = "Tim";
上記のコードは代入演算子のため無効です。設定が必要な複合オブジェクト内のプロパティを識別するために、ラムダ式を渡す必要があります。場合によっては、複雑なオブジェクトに List が含まれているため、オブジェクトの種類と名前が重複しているため、更新するオブジェクトのフィールドを明示的に参照するにはラムダが必要です。
以下を使用して値を取得できますが、問題ありません。しかし、この同じロジックを使用して値を設定する方法がわかりません.Expression.Assignに出くわし、これが解決策であると信じています.
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);
}
アップデート:
「プロパティの割り当てを式ツリーとしてメソッドに渡します...」
ParentTypeA で SetValue メソッドを使用すると、Value は機能しません。(コードの下)
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);
}