gpt4 book ai didi

c# - 替换表达式树中的参数值

转载 作者:行者123 更新时间:2023-11-30 12:30:32 25 4
gpt4 key购买 nike

找了好久,还是没有找到想要的答案。我找到了有关在树中添加和删除参数的答案,但没有找到有关替换特定参数的答案。

我的第一个方法如我所愿,我需要用 Uri 转义值替换 partitionKey 值,然后返回未转义的结果。

public override IList<T> GetRowEntityList(string partitionKey)
{
IList<T> rowEntities = base.GetRowEntityList(Uri.EscapeDataString(partitionKey));
return rowEntities.Select(UnEscapeRowEntity).ToList();
}

我遇到的问题是覆盖此方法以使其以相同的方式运行。我已经知道类型 T 具有属性 PartitionKeyRowKey 但也可以具有任何其他数量的属性。

对于示例谓词:

x => x.RowKey == "foo/bar" && x.SomeValue == "test" 

我希望它变成

x => x.RowKey == Uri.EscapeDataString("foo/bar") && x.SomeValue == "test"  

有办法吗?

我的基类使用此谓词通过 Where(predicate) 调用对包含 T 类型实体的表进行表查找

public override IList<T> GetRowEntityList(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
//modify predicate value here

return base.GetRowEntityList(predicate);
}

最佳答案

你需要实现一个 ExpressionVisitor :

class MyVisitor : ExpressionVisitor
{
protected override Expression VisitBinary(BinaryExpression node)
{
if(CheckForMatch(node.Left))
return Expression.Equal(node.Left, Rewrite(node.Right));

if(CheckForMatch(node.Right))
return Expression.Equal(Rewrite(node.Left), node.Right);

return Expression.MakeBinary(node.NodeType, Visit(node.Left), Visit(node.Right));
}

private bool CheckForMatch(Expression e)
{
MemberExpression me = e as MemberExpression;
if(me == null)
return false;

if(me.Member.Name == "RowKey" || me.Member.Name == "PartitionKey")
return true;
else
return false;
}

private Expression Rewrite(Expression e)
{
MethodInfo mi = typeof(Uri).GetMethod("EscapeDataString");

return Expression.Call(mi, e);
}
}

我认为是的。有点难考。请注意,这仅适用于 (x => x.RowKey == "some string") 的有限情况。它不适用于 (x => x.RowKey.Equals("somestring")。它也不适用于 (x => x.RowKey() == "一些字符串").

然后您使用已实现的访问者来重写谓词:

Expression<Func<T, bool>> predicate = (s => s.RowKey == "1 2");

ExpressionVisitor v = new MyVisitor();
Expression<Func<T, bool>> rewrittenPredicate = v.Visit(predicate);

//rewrittenPredicate then tests if s.RowKey == "1%202"

关于c# - 替换表达式树中的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15908669/

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