动态表达式和动态字符串操作
本文关键字:动态 操作 字符串 表达式 | 更新日期: 2023-09-27 18:30:53
所以,我正在尝试学习如何将我自己的表达式组合在一起,传递对象并编译以检索生成的结果,而我试图准确理解我的对象实例在所有这些中的位置。
所以这就是我到目前为止从阅读代码和逐步完成
-
创建对象实例、表达式字符串和参数。
T SampleString = "Some String I have"; var operation= "it.Replace(@0, @1)"; var operationParameters = new [] { "e", "CLOWN"};
-
创建一个参数表达式对象以指定将对其执行操作的参数类型
ParameterExpression[] parameters = new ParameterExpression[] { Expression.Parameter(typeof(T), "") };
-
使用 ExpressionParser 类,创建需要针对对象执行的表达式
ExpressionParser parser = new ExpressionParser(parameters, operation, operationParameters );
-
调用 ExpressionParser Parse 方法来检索生成的表达式,并向其传递所需的结果类型
var generatedExpression = parser.Parse(typeof(String));
-
现在调用 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)