首页 资讯 社群 我的社区 搜索

System.Linq.Dynamic字符串转委托

yimo~
2020-05-07 15:40:29

一、安装

NuGet程序管理器,System.Linq.Dynamic 

二、应用与性能:

class Model
{
    public string name;
    public Model(string s)
    {
        name = s; 
    }
}
//创建示例数据:
Model m1 = new Model("111");
Model m2 = new Model("222");
List<Model> list = new List<Model>();
list.Add(m1);
list.Add(m2);

//普通Lambda
list.Where(m=>m.name.StartsWith("1")).ToList();

//DynamicQuery
list.AsQueryable().Where("name.StartsWith(@0) ", "1").ToList();
效果一样,但性能开销不同,各执行1000次循环:



var lambda = DynamicExpression.ParseLambda<Model, bool>("name.StartsWith(@0)", "1");
var fun = expfun.Compile();
list.Where(s => fun(s)).ToList();

运行1000次看下,虽然和原生的还有差距,但已经在可以接受的范围内了。

三、其他方法:

//DynamicExpression中还有CreateClass可以实现类的动态创建:
var tp = DynamicExpression.CreateClass(new DynamicProperty("a", typeof(decimal)), new DynamicProperty("b", typeof(decimal)));
var obj = Activator.CreateInstance(tp);
tp.GetProperty("a").SetValue(obj, 12m,null);
tp.GetProperty("b").SetValue(obj, 10m, null);
//此时一个包含a,b属性的实例obj已经创建好,这时利用ParseLambda<T,S>就可以做到很多事情,比如根据字符串进行运算。
var lambda = DynamicExpression.ParseLambda(tp,typeof(decimal),"a*b+2");
var fun = lambda.Compile();
decimal sum = (decimal)fun.DynamicInvoke(obj);
//其他的比如根据已知类型也可进行一些想要的操作:
DynamicExpression.ParseLambda<Model, string>("@0 + name", "名字:");

有时string转成函数执行还是很方便的,用这个做一个计算器小程序的话,运算符解析什么的就完全不需要考虑了。

 
用户评论