Діючи на відповідь на мій Вибір властивості моделі, використовуючи лямбда, а не запитання назви властивості рядка , бажаючи додати властивості до колекції наступним чином:
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;
}
Однак під час запуску коду я виявив, що деякі лямбди давали значення MemberExpression, як очікувалося, але інші - значення UnaryExpression . Мені довелося змінити перший рядок коду на наступний, перш ніж я міг додати всі свої властивості за допомогою лямбда:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Усі властивості є "простими" типами, тобто рядок, DateTime, int, bool тощо у бізнес-об'єкті POCO. Вони прикрашені різними атрибутами DataAnnotations .
Що змушує деякі лямбди в моєму прикладі отримувати значення MemberExpression, а інші значення UnaryExpression ? У моєму прикладі перший UnaryExpression знаходиться в третьому рядку, властивість DateTime , але логічні властивості також призводять до UnaryExpressions .