gpt4 book ai didi

c# - 将 Expression> 转换为 Expression>

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:04 25 4
gpt4 key购买 nike

我正在尝试创建一个通用的“更新表达式构建器”——一个可以传递的对象,用于指示需要为哪些字段分配什么值。我所做的是:

public class UpdateExpression<TClass> : Dictionary<Expression<Func<TClass, object>>, object> 
{};

public class UpdateExpressionBuilder<TClass>
{
private UpdateExpression<TClass> fieldsValues;

public UpdateExpressionBuilder()
{
fieldsValues = new UpdateExpression<TClass>();
}

public UpdateExpressionBuilder<TClass> Add<TField>(Expression<Func<TClass, TField>> field, TField value)
{
fieldsValues.Add(field, value);
return this;
}

public UpdateExpression<TClass> Build()
{
return fieldsValues;
}
}

这意味着用作:

var personUpdateExpression = new UpdateExpressionBuilder<Person>()
.Add(p => p.FirstName, "David")
.Add(p => p.MiddleName, "A")
.Build();

然后我可以将 personUpdateExpression 作为参数发送到任何方法,例如数据库更新。

问题是调用fieldsValues.Add(field, value)不编译。错误是:

error CS1503: Argument 1: cannot convert from
'System.Linq.Expressions.Expression<System.Func<TClass, TField>>' to
'System.Linq.Expressions.Expression<System.Func<TClass, object>>'

我尝试添加约束 where TField : class, new()但这并没有改变任何东西。

改变签名时添加到 Add(Expression<Func<TClass, object>> field, object value)它工作得很好。然而,我放松了编译时类型检查,所以 Add(p => p.FirstName, 123)将编译,但在运行时失败。

最佳答案

我完全同意 Daisy 在其评论中所写的内容......你还是有所要求:

public UpdateExpressionBuilder<TClass> Add<TField>(Expression<Func<TClass, TField>> field, TField value)
{
var body = field.Body;

// Boxing for value types
if (typeof(TField).IsValueType)
{
body = Expression.Convert(body, typeof(object));
}

Expression<Func<TClass, object>> field2 = Expression.Lambda<Func<TClass, object>>(body, field.Parameters);

fieldsValues.Add(field2, value);
return this;
}

然后

var personUpdateExpression = new UpdateExpressionBuilder<Person>()
.Add(p => p.FirstName, "David")
.Add(p => p.MiddleName, "A")
.Add(p => p.Age, 30)
.Build();

请注意,您的示例仅包含字符串,但我为 int 添加了一个示例.

最后我们重写了Expression .对于引用类型,除了更改 Func<> 的返回类型外不需要做任何事情。 .对于值类型,您需要显式装箱。

关于c# - 将 Expression<Func<TClass, TField>> 转换为 Expression<Func<TClass, object>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com