之前一直想着有没有一个方法可以把字符串直接转化成函数的,恰好有需求就找了下,还真有。html
微软地址:https://docs.microsoft.com/en-us/previous-versions/bb894665(v=msdn.10)?redirectedfrom=MSDN小程序
1、安装函数
NuGet程序管理器,System.Linq.Dynamic 性能
2、应用与性能:spa
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次循环:
尝试其余方法,ParseLambda ,把条件单独出来得到函数委托,再调用Linq的Where。
var lambda = DynamicExpression.ParseLambda<Model, bool>("name.StartsWith(@0)", "1"); var fun = expfun.Compile(); list.Where(s => fun(s)).ToList();
运行1000次看下,虽然和原生的还有差距,但已经在能够接受的范围内了。.net
3、其余方法:code
//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转成函数执行仍是很方便的,用这个作一个计算器小程序的话,运算符解析什么的就彻底不须要考虑了。xml
参考连接:htm
https://www.cnblogs.com/David-Qian/archive/2009/01/22/1379596.htmlblog