C # используя PropertyInfo из отражения в лямбда-выражении, ошибка: недопустимое выражение свойства

#c# #.net #reflection

#c# #.net #отражение

Вопрос:

У меня есть цикл, в котором я хотел бы перебирать только свойства моего объекта с определенным декоратором / атрибутом, и для этих свойств, если они равны нулю, затем удалите их из состояния, измененного Entity Framework. Я могу заставить цикл работать, но не отслеживать их удаление.

Это моя попытка:

                 // Protect [NullUpdateIgnoreAttribute] attributes from nullification
                var properties = updateCustomer.GetType().GetProperties().Where(
                    prop => Attribute.IsDefined(prop, typeof(NullUpdateIgnoreAttribute)));

                foreach (var p in properties)
                {
                    Console.WriteLine($"Verifying {p.Name}...");
                    object value = p.GetValue(updateCustomer, null);
                    if (value == null)
                    {
                        Console.WriteLine($"{p.Name} is null. Shielding attribute.");
                        loyalty.Entry(customer).Property(x => p.Name).IsModified = false; 
                    }
                }
  

Это сбой из-за того, что я передаю loyalty.Entry().Property(x => here).IsModified = false . Очевидно, что я не могу использовать propertyInfo напрямую. Если бы я делал это обычно, я бы просто передал x => x.propertyname . (например x.firstname ) но я не могу жестко закодировать имя свойства здесь, это может быть любое из нескольких свойств, имеющих этот атрибут.

Выдается ошибка:

     "message": "The expression 'x => value(LCSApi.Customer <>c__DisplayClass22_2).p.Name' is not a valid property expression. The expression should represent a simple property access: 't => t.MyProperty'. (Parameter 'propertyAccessExpression')",
  

Ответ №1:

Существует перегрузка, которая принимает имя свойства как a string , поэтому вы можете использовать это:

 loyalty.Entry(customer).Property(p.Name).IsModified = false;
  

Комментарии:

1. Да, вы могли бы построить выражение динамически, но перегрузка строк проще.

2. Спасибо. Я не могу поверить, что пропустил перегрузку. Слишком много смотрю на Visual Studio, недостаточно кофе :).