如何设置函数内部对象的属性值?

时间:2019-04-09 14:14:49

标签: c# object reflection expression entity

我正在使用实体框架以及存储库模式来与数据库进行交互。

为简单起见,我正在做这样的事情。

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
}

例如

  

Update(Customer,x => x.FirstName =“ John”,x => x.Id == 4);

客户将为空,这需要查找。那部分起作用。

我需要将客户的名字更新为john,其中Id == 4。 我想传入表达式并将其附加到要更新的dbEntity。

  

x => x.FirstName =“约翰”

应该以某种方式变为

  

dbEntity.FirstName =“约翰”

我该怎么做?

1 个答案:

答案 0 :(得分:0)

好的,这就是我最后要做的。我发现this function似乎可以解决问题。

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;
}

我这样称呼

  

Update(new Customer(),x => x.FirstName,“ John”,x => x.Id == 4);