动态表达式和动态字符串操作

本文关键字:动态 操作 字符串 表达式 | 更新日期: 2023-09-27 18:30:53

所以,我正在尝试学习如何将我自己的表达式组合在一起,传递对象并编译以检索生成的结果,而我试图准确理解我的对象实例在所有这些中的位置。

所以这就是我到目前为止从阅读代码和逐步完成

  1. 创建对象实例、表达式字符串和参数。

    T SampleString = "Some String I have";
    var operation= "it.Replace(@0, @1)";
    var operationParameters = new [] { "e", "CLOWN"};
    
  2. 创建一个参数表达式对象以指定将对其执行操作的参数类型

    ParameterExpression[] parameters = new ParameterExpression[] { Expression.Parameter(typeof(T), "") };
    
  3. 使用 ExpressionParser 类,创建需要针对对象执行的表达式

    ExpressionParser parser = new ExpressionParser(parameters, operation, operationParameters );
    
  4. 调用 ExpressionParser Parse 方法来检索生成的表达式,并向其传递所需的结果类型

    var generatedExpression = parser.Parse(typeof(String));
    
  5. 现在调用 Expression.Lamba,将生成的表达式和项传递给它

    var StringReplaceresult = Expression.Lambda<Func<T,String> >(generatedExpression , parameters).Compile()(item);
    

不太确定上述内容是否正确,或者我遇到的问题究竟是从哪里开始的。我知道我的编译失败了 (5)。该消息是关于没有将正确数量的参数传递给那里的 Expression.Lamba 方法。但我想知道这是否真的是问题所在,因为同样,我不确定我是否得到这个 60%,所以我很感激有人会在必要时纠正我上面的工作。

动态表达式和动态字符串操作

我假设您使用的是 Scott Guthrie 描述的动态 Linq 查询库:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

如果是这样,我认为您想要:

string sampleString = "some string I have";
var operation= "it.Replace(@0, @1)";
var operationParameters = new [] { "e", "CLOWN"};
Expression<Func<string, string>> expr = DynamicExpression.ParseLambda<string, string>(operation, operationParameters);
string result = expr.Compile().Invoke(sampleString);

当我在 LinqPad 中运行它时,result的值是"somClown 字符串我有小丑"

DynamicExpression.ParseLambda允许您将参数类型指定为泛型类型参数,而不是像以前那样通过显式创建 ParameterExpression 数组来执行此操作。

ParseLambda<> 调用返回一个强类型Expression<TDelegate>对象,它Compile()方法将基础 lambda 表达式编译为可执行代码,并将其作为正确类型的委托返回,然后可以调用该委托。这意味着Invoke()返回正确类型的对象(在本例中string),而不是必须强制转换的object。因此,即使您从非强类型代码开始,您也会尽快回到类型安全。

http://msdn.microsoft.com/en-us/library/bb345362.aspx

附言

在我拥有的源代码中,ExpressionParser是内部的,你这个顽皮的男孩/女孩;o)