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

C# 如何设置函数内对象的属性值?,c#,object,reflection,expression,entity,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

我使用实体框架和存储库模式与数据库交互

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

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
}
public T Update(T实体,ItemINeedPassedIn,表达式谓词)
{
var dbEntity=await GetOneAsync(谓词);//这将获取要更改的实体
//将属性值附加到实体的代码位于此处x.FirstName=“John”,x=>x.Id==4)

Customer将为null,这需要查找。该部分有效

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

x=>x.FirstName=“约翰”

应该成为

dbEntity.FirstName=“John”


我该怎么做呢?

好的,这是我最后做的。我找到了似乎能奏效的方法

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);
}
publicstaticvoidsetEntityValue(TDBTable实体、表达式、对象值)
{
ParameterExpression值ParameterExpression=Expression.Parameter(类型(对象));
表达式targetExpression=Expression.Body是UnaryExpression?((UnaryExpression)Expression.Body)。操作数:Expression.Body;
var newValue=Expression.Parameter(Expression.Body.Type);
var assign=Expression.Lambda
(
Expression.Assign(targetExpression,Expression.Convert(valueParameterExpression,targetExpression.Type)),
expression.Parameters.Single(),
valueParameterExpression
);
assign.Compile().Invoke(实体、值);
}
我在update函数中调用它

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;
}
public T Update(TDBTable实体、表达式、对象值、,
表达式(谓词)
{
var dbEntity=await GetOneAsync(谓词);//这将获取要更改的实体
//设置变量
SetEntityValue(结果、表达式、值);
//更新实体
结果=等待编辑异步(结果);
返回实体;
}
我这样称呼它

更新(newcustomer(),x=>x.FirstName,“John”,x=>x.Id==4)


好的,这就是我最后做的。我发现了似乎能起作用的方法

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);
}
publicstaticvoidsetEntityValue(TDBTable实体、表达式、对象值)
{
ParameterExpression值ParameterExpression=Expression.Parameter(类型(对象));
表达式targetExpression=Expression.Body是UnaryExpression?((UnaryExpression)Expression.Body)。操作数:Expression.Body;
var newValue=Expression.Parameter(Expression.Body.Type);
var assign=Expression.Lambda
(
Expression.Assign(targetExpression,Expression.Convert(valueParameterExpression,targetExpression.Type)),
expression.Parameters.Single(),
valueParameterExpression
);
assign.Compile().Invoke(实体、值);
}
我在update函数中调用它

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;
}
public T Update(TDBTable实体、表达式、对象值、,
表达式(谓词)
{
var dbEntity=await GetOneAsync(谓词);//这将获取要更改的实体
//设置变量
SetEntityValue(结果、表达式、值);
//更新实体
结果=等待编辑异步(结果);
返回实体;
}
我这样称呼它

更新(newcustomer(),x=>x.FirstName,“John”,x=>x.Id==4)


什么是
ItemINeedPassedIn
?为什么要将4分配给Id?它应该是
x.Id==4
?itemineedpassin是我正在寻找的,更新的Id==4我想问题是:
ItemINeedPassedIn
dbEntity
?或者,在调用
Update
之前您不知道它们的类型吗?您知道吗谓词中的
x
类型?我认为,最简单的回答方法是,你给我们一个输入和所需的输出,同时澄清类型是否已知。你实际上需要
表达式,还是只需要
函数
?什么是
ItemINeedPassedIn
?为什么要将4指定给Id?应该是
x吗.Id==4
?ItemINeedToPassIn是我正在寻找和更新的Id==4我想问题是:
ItemINeedPassedIn
dbEntity
的类型是什么?或者,在调用
Update
之前你不知道它们吗?你知道谓词中
x
的类型吗?我认为最简单的回答方法是您可以为我们提供输入和所需输出,同时说明类型是否已知。您实际上需要
表达式
,还是只需要
Func