您的位置:首页 > 其它

利用Linq快速访问对象属性

2008-04-17 23:29 405 查看
今天看《Linq in Action》时突然萌生了一个想法使用Expression和Linq来快速访问对象的属性。如果我们把一个对象放到数组中对其进行查询,然后使用select将需要的属性投影出来就可以达到快速访问的目的。虽然比直接访问要慢很多,但是比反射方式快1个数量级还是非常不错的。
假设有实体类定义如下:


public class User




...{


public string Name




...{ get; set; }


public int Age




...{ get; set; }


}
如果我们想访问Name字段的值需要这样做




var books = new User[] ...{ new User ...{Name = "Lucifer", Age = 26 } };


var val = books.Select(book => book.Name).First();
非常简单是吧,接下来只要把他用Expression翻译一下,并编成泛型的就可以了。代码如下:


using System;


using System.Collections.Generic;


using System.Linq;


using System.Linq.Expressions;


using System.Diagnostics;




public class QuickAccess<T>




...{


static Dictionary<int, Delegate> __pMap = new Dictionary<int, Delegate>();




static T[] __lst = new T[] ...{ default(T) };




public static P Get_ProperyVal<P>(T obj, string pName)




...{


var func = default(Func<T, P>);


__lst[0] = obj;




try




...{


func = (Func<T, P>)__pMap[pName.GetHashCode()];


}


catch




...{




/**//*


* from param in __lst


* select param.pName


* */


var param = Expression.Parameter(typeof(T), "param");


var body = Expression.Property(param, pName);


var lambda = Expression.Lambda(body, param);


__pMap.Add(pName.GetHashCode(), lambda.Compile());


func = (Func<T, P>)__pMap[pName.GetHashCode()];


}




return Enumerable.Select(__lst, func).First();




}


}


//调用代码


int val = 0;




var user = new User...{ Name = "Lucifer", Age = 26 };


Stopwatch sw1 = new Stopwatch();


sw1.Start();


for (int i = 0; i < 10000000; ++i)




...{


val = QuickAccess<User>.Get_ProperyVal<int>(user, "Age");


}


sw1.Stop();


Console.WriteLine(sw1.ElapsedMilliseconds);
虽然这段代码不太实用不过能体现出Linq和Expression的强大,谢谢观看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐