gpt4 book ai didi

.net - 将表达式> 转换为表达式>

转载 作者:行者123 更新时间:2023-12-04 16:23:29 24 4
gpt4 key购买 nike

我如何创建一个通用的辅助方法来将 Func 使用的类型在表达式中从一种类型转换为另一种类型

我有一个 Expression<Func<IEmployee, bool>>我想把它转换成

Expression<Func<Employee, bool>>.

第二个类型总是实现第一个类型。我正在努力实现通用解决方案。

编辑

我已将问题编辑得更清楚。

最佳答案

好吧,您可以创建一个表达式,将其参数转换为原始表达式,然后将其转发给原始表达式:

Expression<Func<IEmployee, bool>> source = ...

var param = Expression.Parameter(typeof(Employee));

// Types the argument as the type expected by the source expression
// and then forwards it...
var invocationExpr = Expression.Invoke
(source, Expression.TypeAs(param, typeof(IEmployee)));

var result = Expression.Lambda<Func<Employee, bool>>(invocationExpr, param);

如果提供者不支持调用表达式,你可能需要更多替换源表达式中的参数的复杂解决方案。

编辑:好的,既然您说您的提供者不喜欢结果表达式,那么这里有一个替代示例。这是一个参数替换器应该是什么样子的粗略切割(我现在只是将其作为示例编写),但它应该可以很好地满足您的目的。

public static class ParameterReplacer
{
// Produces an expression identical to 'expression'
// except with 'source' parameter replaced with 'target' parameter.
public static Expression<TOutput> Replace<TInput, TOutput>
(Expression<TInput> expression,
ParameterExpression source,
ParameterExpression target)
{
return new ParameterReplacerVisitor<TOutput>(source, target)
.VisitAndConvert(expression);
}

private class ParameterReplacerVisitor<TOutput> : ExpressionVisitor
{
private ParameterExpression _source;
private ParameterExpression _target;

public ParameterReplacerVisitor
(ParameterExpression source, ParameterExpression target)
{
_source = source;
_target = target;
}

internal Expression<TOutput> VisitAndConvert<T>(Expression<T> root)
{
return (Expression<TOutput>)VisitLambda(root);
}

protected override Expression VisitLambda<T>(Expression<T> node)
{
// Leave all parameters alone except the one we want to replace.
var parameters = node.Parameters.Select
(p => p == _source ? _target : p);

return Expression.Lambda<TOutput>(Visit(node.Body), parameters);
}

protected override Expression VisitParameter(ParameterExpression node)
{
// Replace the source with the target, visit other params as usual.
return node == _source ? _target : base.VisitParameter(node);
}
}
}

然后将其用作:

Expression<Func<IEmployee, bool>> expression = ...

var result = ParameterReplacer.Replace
<Func<IEmployee, bool>, Func<Employee, bool>>
(expression,
expression.Parameters.Single(),
Expression.Parameter(typeof(Employee));

关于.net - 将表达式<Func<FromType>> 转换为表达式<Func<ToType>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051003/

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