Zac*_*ott 6 c# system.linq.dynamic
在下面的代码中,我成功地在C#中使用Microsoft的System.Linq.Dynamic来评估类似于Javascript的字符串表达式eval().但是,在调用新函数时 ,我无法弄清楚如何保证参数名称和相应的值匹配."SKU + \" \" + Name"可以像回归1234 Cola一样容易Cola 1234.我有几十个参数.
System.Dynamic.Linq的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"
Run Code Online (Sandbox Code Playgroud)
以下是上面的使用和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;
Run Code Online (Sandbox Code Playgroud)