Почему некоторые Свойства объекта UnaryExpression и другие MemberExpression?

Опираясь на ответ на мой , выберите свойство модели, используя лямбда, а не вопрос имени свойства строки , желая добавить свойства в коллекцию следующим образом:

var props = new ExportPropertyInfoCollection();
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);

Я написал следующий код в Включите метод :

public class PropertyCollection
{
    public void Include(Expression> 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;

Все свойства являются «простыми» типами, т.е. string, DateTime, int, bool и т. Д. В бизнес-объекте POCO , Они украшены несколькими различными атрибутами DataAnnotations .

Что приводит к тому, что некоторые лямбды в моем примере приводят к значениям MemberExpression и другим значениям UnaryExpression ? В моем примере первое UnaryExpression находится в третьей строке, свойство DateTime , но логические свойства также приводят к UnaryExpressions .

70
задан Community 23 May 2017 в 11:54
поделиться

1 ответ

Кажется, я знаю, в чем проблема. Ваше выражение возвращает тип объект.

Если вы измените это на Expression>, тип возвращаемого значения должен быть выведен правильно, а UnarExpression (которое, как я предполагаю, является некоторой операцией упаковки) должно не происходит.

Обновление:

Подпись для Include должна быть:

public void Include<T, R>(Expression<Func<T, R>> expression)
58
ответ дан 24 November 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: