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
?