System.Linq.Dynamic:如何保证Parse函数中的参数顺序?

时间:2018-06-03 22:37:42

标签: c# system.linq.dynamic

在下面的代码中,我成功使用C#中的Microsoft System.Linq.Dynamic来评估类似于Javascript eval()的字符串表达式。但是,在调用新函数时,我无法弄清楚如何保证参数名称和相应的值匹配。 "SKU + \" \" + Name"可以像1234 Cola一样轻松地返回Cola 1234 。我有几十个参数。

System.Dynamic.Linq&#39; Parse方法使用Dictionary<string,object>来保存内部参数,这是我的问题,因为Dictionary不保证像数组和列表这样的顺序。 我假设因为Microsoft选择使用Dictionary,必须对下面的代码进行一些简单的修复,以确保参数值匹配。代码在LinqPad中输入。

命名参数是否可能像Name: "Cola", SKU: "1234"一样?是否有一些数据类型或技术可用于保证参数名称和值匹配?这是否需要更改Microsoft的代码才能替换Dictionary?

var symbols = new Dictionary<String, Object>();         // Cannot change symbols datatype
var paramExp = new List<ParameterExpression>();
var paramVal = new List<String>();

var fields = new Dictionary<String,String>();                              // Sample Data
fields["SKU"] = "1234";
fields["Name"] = "Cola";
fields["Type"] = "Drink";
var expression = "SKU + \" \" + Name";

foreach( var f in fields) {                                           // Setup Parameters
    ParameterExpression x =
        Expression.Parameter(Type.GetType("System.String"), f.Key);
    symbols.Add( f.Key, x);
    paramExp.Add( x);
    paramVal.Add( f.Value);
}

Expression body = System.Linq.Dynamic.DynamicExpression.Parse(  
    Type.GetType("System.String"), expression, symbols);

LambdaExpression e = Expression.Lambda(body, 
    paramExp.ToArray());                                      // Order may not match body

var c = e.Compile();

c.DynamicInvoke(paramVal.ToArray());             // Same here ... possible order mismatch
// c.Dump(); // outputs "1234 Cola" 

以上是上面的用法和System.Linq.Dynamic:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Linq.Dynamic;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Threading;

0 个答案:

没有答案