Как установить значение свойства объекта внутри функции? - PullRequest
1 голос
/ 09 апреля 2019

Я использую Entity Framework и шаблон хранилища для взаимодействия с базой данных.

Для простоты я делаю что-то вроде этого.

public T Update(T entity)
{
     // Update Entity
}

То, что я хочу сделать вместо того, чтобы изменять сущность вне функции, я хочу, чтобы была возможность передать выражение для обновления объекта.

public T Update(T entity, ItemINeedPassedIn, Expression<Func<TDBTable, bool>> predicate)
{
     var dbEntity = await GetOneAsync(predicate); // Which fetches me the entity to change

     // Code to attach the property value to entity goes here <-- This is what I need

     // Update Entity
}

Например

Обновление (Customer, x => x.FirstName = "John", x => x.Id == 4);

Клиент будет нулевым, что требует поиска. Эта часть работает.

Мне нужно обновить имя клиента до john, где Id == 4. Я хочу передать выражение и прикрепить его к dbEntity для обновления.

x => x.FirstName = "John"

должно как-то стать

dbEntity.FirstName = "Джон"

Как мне это сделать?

1 Ответ

0 голосов
/ 09 апреля 2019

Хорошо, вот что я в итоге сделал.Я нашел эту функцию , которая, кажется, делает свое дело.

public static void SetEntityValue(TDBTable entity, Expression<Func<TDBTable, object>> expression, object value)
{
    ParameterExpression valueParameterExpression = Expression.Parameter(typeof(object));
    Expression targetExpression = expression.Body is UnaryExpression ? ((UnaryExpression)expression.Body).Operand : expression.Body;

    var newValue = Expression.Parameter(expression.Body.Type);
    var assign = Expression.Lambda<Action<TDBTable, object>>
    (
        Expression.Assign(targetExpression, Expression.Convert(valueParameterExpression, targetExpression.Type)),
        expression.Parameters.Single(),
        valueParameterExpression
    );

    assign.Compile().Invoke(entity, value);
}

Я вызываю ее в своей функции обновления

public T Update(TDBTable entity, Expression<Func<TDBTable, object>> expression, object value,
        Expression<Func<TDBTable, bool>> predicate)
{
     var dbEntity = await GetOneAsync(predicate); // Which fetches me the entity to change

     // Sets the variable
     SetEntityValue(result, expression, value);

     // Update Entity
     result = await EditAsync(result);

     return entity;
}

Я называю это так

Обновление (новый Customer (), x => x.FirstName, "John", x => x.Id == 4);

...