- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何创建一个通用的辅助方法来将 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/
有什么方法可以将字符串插入到 Type[] 数组中吗?或者字符串可以存储在字符串数组中? Fruit[] f=new Fruit[10]; Orange a=new Orange(); f[0]=a.
运行以下代码时出现错误: let em = new breeze.EntityManager('http://localhost/api'); let query = breeze.EntityQue
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我如何创建一个通用的辅助方法来将 Func 使用的类型在表达式中从一种类型转换为另一种类型 我有一个 Expression>我想把它转换成 Expression>. 第二个类型总是实现第一个类型。我正
考虑一个类 public class Fraction { public T Numerator{get; set;} public T Denominator{get; se
我是一名优秀的程序员,十分优秀!