У меня есть следующий объект:
public class ContactImport {
public long Id {get;set;}
public Contact Contact {get;set;}
public Company Company {get;set;}
public Address Address {get;set;}
}
Я хочу иметь возможность динамически устанавливать свойства вложенных объектов на основе выражения, переданного в (Expression<Func<T, dynamic>>
).
Для этого у меня есть следующий метод, он отлично работает для установки свойств объекта верхнего уровня (например, Id), но терпит неудачу при попытке установить что-либо для вложенных объектов (например, Contact.FirstName)
public static void SetPropertyValue<T, TProp>(this T target, Expression<Func<T, TProp>> member, TProp value) {
var selectorExpr = (MemberExpression)(member.Body is UnaryExpression ? ((UnaryExpression)member.Body).Operand : member.Body);
if (selectorExpr != null) {
var property = selectorExpr.Member as PropertyInfo;
if (property != null) {
property.SetValue(target, value);
}
}
}
Похоже, он пытается установить свойство для объекта верхнего уровня, но не может. Я понимаю, что это возможно, но я не уверен, как добиться этого с тем, что у меня есть сейчас.
Метод SetPropertyValue
вызывается следующим образом:
public class ImportCheck<T> {
public int id { get; set; }
public string Name { get; set; }
public Type Type { get; set; }
public bool Required { get; set; }
public int? MinLength { get; set; }
public int? MaxLength { get; set; }
public string Value { get; set; }
public Expression<Func<T, dynamic>> AssociatedProperty { get; set; }
}
T pt = (T)Activator.CreateInstance(typeof(T));
foreach (var m in mapping) {
pt.SetPropertyValue(m.AssociatedProperty, Convert.ChangeType(m.Value, Nullable.GetUnderlyingType(m.Type) ?? m.Type));
}
В приведенном выше примере T
— это ContactImport
, m.AssociatedProperty
— это выражение, а mapping
— это List<ImportCheck<ContactImport>>
.
Обновить
Моя проблема, кажется, сводится к тому факту, что выражение, передаваемое в SetPropertyValue
, имеет возвращаемый тип dynamic
. Если установлено значение int
, а свойство вложенного объекта равно int
, тогда все работает. Проблема, с которой я столкнулся, заключается в том, что мне нужно явно указать результат выражения, чтобы он соответствовал типу целевого свойства. Это, однако, оставляет меня с другой проблемой в том, что мне нужен список ImportCheck
s с возможностью каждого Expression<Func<T,dynamic>>
иметь другой тип возврата.
SetPropertyValue
. - person Sergey Kalinichenko   schedule 09.07.2015AssociatedProperty
с помощью чего-то вродеx=>x.Contact.FirstName
- person Gaz   schedule 09.07.2015