System.Linq.Dynamic字符串轉委托


 

以前一直想着有沒有一個方法能夠把字符串直接轉化成函數的,剛好有需求就找了下,還真有。

微軟地址: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

https://blog.csdn.net/xuchen_wang/article/details/90749743

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM