#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, недостаточно кофе :).