gpt4 book ai didi

c# - 将 Expression> 转换为 Expression> 以便 T 成为 T1 的成员

转载 作者:太空狗 更新时间:2023-10-29 23:14:07 26 4
gpt4 key购买 nike

我们有一个 T1 类型的实体它有一个 T 类型的成员.像这样:

public class T1
{
public T Member{get;set;}
}

用户可以使用我们的 UI 为我们提供对 T 的过滤器,我们已将其转换为获取 T 并返回 bool (Expression<Func<T,bool>>) 的函数表达式。

我想知道是否可以将其转换为获取 T1 并返回 bool 的函数表达式。

实际上我想转换这个:

(t=>t.Member1==someValue && t.Member2==someOtherValue);

为此:

(t1=>t1.Member.Member1==someValue && t1.Member.Member2==someOtherValue);

最佳答案

您可以通过几种方式来完成。

第一个也是最简单的:使用 Expression.Invoke

Expression<Func<T, bool>> exprT = t.Member1==someValue && t.Member2==someOtherValue
ParameterExpression p = Expression.Parameter(typeof(T1));
var expr = Expression.Invoke(expr, Expression.PropertyOrField(p, "Member"));
Expression<Func<T1, bool>> exprT1 = Expression.Lambda<Func<T1, bool>>(expr, p);

但在这种情况下你得不到

t1 => (t=>(t.Member1==someValue && t.Member2==someOtherValue))(t1.Member), 

代替

(t1=>t1.Member.Member1==someValue && t1.Member.Member2==someOtherValue);

要替换,您可以使用 ExpressionVisitor class喜欢

    class V : ExpressionVisitor
{
public ParameterExpression Parameter { get; private set; }
Expression m;
public V(Type parameterType, string member)
{
Parameter = Expression.Parameter(parameterType);
this.m = Expression.PropertyOrField(Parameter, member);
}
protected override Expression VisitParameter(ParameterExpression node)
{
if (node.Type == m.Type)
{
return m;
}
return base.VisitParameter(node);
}
}

并使用它

var v = new V(typeof(T1), "Member");
var exprT1 = Expression.Lambda<Func<T1, bool>>(v.Visit(exprT.Body), v.Parameter);

关于c# - 将 Expression<Func<T,bool>> 转换为 Expression<Func<T1,bool>> 以便 T 成为 T1 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29893512/

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