Выполняя ответ на мой выберите свойство модели, используя имя лямбда, а не имя свойства строки, желая добавить свойства в коллекцию следующим образом:
var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
Я написал следующий код в методе Include
:
public class PropertyCollection<T>
{
public void Include(Expression<Func<T, object>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
Однако при запуске кода я обнаружил, что некоторые из lambdas дали значения MemberExpression, как ожидалось, но другие дали значения UnaryExpression. Мне пришлось изменить первую строку кода на следующие, прежде чем я смог добавить все свои свойства, используя lambdas:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Все свойства "простые", т.е. строка, DateTime, int, bool и т.д. в бизнес-объекте POCO. Они украшены несколькими изменяющимися атрибутами DataAnnotations.
Что заставляет некоторые из lambdas в моем примере получить значения MemberExpression и другие значения UnaryExpression? В моем примере первое UnaryExpression находится в третьей строке, свойство DateTime, но логические свойства также приводят к UnaryExpressionions.