利用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的强大,谢谢观看。
假设有实体类定义如下:
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的强大,谢谢观看。
相关文章推荐
- LINQ快速开发设计最佳实践(三) LINQ数据访问与业务逻辑层对象模板
- 【OC学习-31】利用KVC即键值编码来访问一些对象的属性,尽管这些属性是私有的
- LINQ快速开发设计最佳实践(三) LINQ数据访问与业务逻辑层对象模板
- VS2005小技巧(2):利用重构快速输入属性
- Struts2学习笔记(七):OGNL之<s:property>标签访问值栈(value Stack)对象属性
- PHP实现在对象之外访问其私有属性private及保护属性protected的方法
- Silverlight访问数据库实例 -- 利用WCF Linq sql ——————一篇很好的文章
- HTML、js:如何利用Location对象的常用属性和方法重新加载、刷新页面
- Error #1009: 无法访问空对象引用的属性或方法 --问过的个问题 解决了 记录下
- 利用prototype属性,对JavaScript对象进行功能扩展,比如数组对象Array,String等
- Java -- 利用反射实现对象之间相同属性复制BeanUtil
- JavaScript访问对象属性
- Flex4 主程序调用模块方法报TypeError: Error #1009:无法访问空对象引用的属性或方法
- LinkedList中将对象按照某一属性排序,利用 collection.sort(); 来进行调用!
- 对象的属性访问效率的新发现
- java 访问对象中的属性
- 利用反射访问私有属性、调用私有方法
- 请问js对象属性值为什么用数组也可以访问
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- PHP利用COM对象访问SQLServer、Access