gpt4 book ai didi

linq - 如何使用 MethodCallExpression.Update

转载 作者:行者123 更新时间:2023-12-04 05:57:53 24 4
gpt4 key购买 nike

我正在尝试使用 ExpressionVisitor 来修改调用方法的表达式,但未能成功。我有一个 SearchService 封装了搜索逻辑,并希望能够修改传递的搜索参数。

应修改并运行 SearchFunc 的类:

  public class SearchService
{
public Expression<Func<string, string, List<int>>> SearchFunc { get; set; }

public void Run()
{
SearchModifier modifier = new SearchModifier();
Expression<Func<string, string, List<int>>> newFunc = (Expression<Func<string, string, List<int>>>)modifier.Modify(SearchFunc);
}
}

SearchModifier 定义为:
      public class SearchModifier : ExpressionVisitor
{
public Expression Modify(Expression expression)
{
return Visit(expression);
}

protected override Expression VisitMethodCall(MethodCallExpression node)
{
Debug.Print(string.Format("VisitMethodCall: {0}", node.ToString()));
//VisitMethodCall: value(ExpressionTree_test.MainWindow)._adminRepository.SearchUsers("orig val", "orig val2")

//trying to use the Update method to create an amended MethodCallExpression
List<ConstantExpression> newargs = new List<ConstantExpression>();
newargs.Add(Expression.Constant("my new arg 1", typeof(string)));
newargs.Add(Expression.Constant("my new arg 2", typeof(string)));

MethodCallExpression methodCallExpression = node.Update(node, newargs);
//causes exception
//Method 'System.Collections.Generic.List`1[System.Int32] SearchUsers(System.String, System.String)' declared
//on type 'ExpressionTree_test.AdminRepository' cannot be called
//with instance of type 'System.Collections.Generic.List`1[System.Int32]'

Debug.Print(string.Format("Amended VisitMethodCall: {0}", methodCallExpression.ToString()));

return base.VisitMethodCall(node);
}

Run 方法的调用方式如下:
_searchService = new SearchService();
_searchService.SearchFunc = (t, s) => _adminRepository.SearchUsers("orig val", "orig val2");

我找不到关于使用 MethodCallExpression.Update 方法的很多信息,所以我不确定我是否正确执行此操作。如何更改方法中参数的值?
当然,可能有更好的方法来做到这一点,任何建议都非常感谢......

最佳答案

您没有使用 Update 的结果方法。你应该把它传递给 base.VisitMethodCall而不是 node :

return base.VisitMethodCall(methodCallExpression);

编辑

抱歉,我误读了问题... Update 的第一个参数不是正在访问的表达式节点,而是调用该方法的实例。所以代码应该是:
node.Update(node.Object, newargs);

关于linq - 如何使用 MethodCallExpression.Update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9297678/

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