当前位置: 移动技术网 > IT编程>开发语言>c# > System.Linq.Dynamic字符串转委托

System.Linq.Dynamic字符串转委托

2020年05月07日  | 移动技术网IT编程  | 我要评论

 

以前一直想着有没有一个方法能够把字符串直接转化成函数的,刚好有需求就找了下,还真有。

微软地址:https://docs.microsoft.com/en-us/previous-versions/bb894665(v=msdn.10)?redirectedfrom=msdn

 

一、安装

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次循环:

 

 

 

 

 

 

 

 

 

尝试其他方法,parselambda ,把条件单独出来获得函数委托,再调用linq的where。
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转成函数执行还是很方便的,用这个做一个计算器小程序的话,运算符解析什么的就完全不需要考虑了。

参考链接:

https://www.cnblogs.com/david-qian/archive/2009/01/22/1379596.html

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网