还是有人关注的...感动~~~~(>_<)~~~~
代码还没有完全编好..还有些功能要加所以先不开源...(因为开始是想在没
有Linq的2005上使用的.没用扩展方法之类的东西有个类已经有400个以上的
方法还在头痛要不要优化它)如果有人喜欢我晚上回家后放上2.0的DLL和生成工具....在这个框架的中没有复杂的代码.因为我相信越简单的东西性能越好...能一句话实现的尽量一句话实现.基本上就是我们常用的那些方法(和网上收刮来的方法).只是按照我的想法将它放在了一堆方便使用... 我想大家可能对我的ToList为什么会比LINQ快.这个比较感兴趣..
好嘛我就先说下这个嘛.. 我可不想被说不放源码.. 比如ASP.NET 为什么用服务器控件 会比较慢.这个道理可能大家都知道吧因为微软会自动生成 一些出于安全之类的代码.严重影响性能.所以有的人会采用拼接HTML代码等方法来优化代码..虽然很难看但性能的确是优
化了.那C#呢..服务器控件是生成HTML代码那C#呢.当然是中间语言(IL)咯
放代码了.
1 public class DataTableEntityBuilder<Entity>
2 {
3 private static readonly MethodInfo getValueMethod = typeof(DataRow).GetMethod("get_Item", new Type[] { typeof(int) });
4 private static readonly MethodInfo isDBNullMethod = typeof(DataRow).GetMethod("IsNull", new Type[] { typeof(int) });
5 private delegate Entity Load(DataRow dataRecord);
6
7 private Load handler;
8 private DataTableEntityBuilder() { }
9
10 public Entity Build(DataRow dataRecord)
11 {
12 return handler(dataRecord);
13 }
14 public static DataTableEntityBuilder<Entity> CreateBuilder(DataRow dataRecord)
15 {
16 Type type = typeof(Entity);
17 DataTableEntityBuilder<Entity> dynamicBuilder = new DataTableEntityBuilder<Entity>();
18 DynamicMethod method = new DynamicMethod("DynamicCreateEntity", type, new Type[] { typeof(DataRow) }, type, true);
19 ILGenerator generator = method.GetILGenerator();
20 LocalBuilder result = generator.DeclareLocal(type);
21 generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
22 generator.Emit(OpCodes.Stloc, result);
23
24
25 for (int i = 0; i < dataRecord.ItemArray.Length; i++)
26 {
27 PropertyInfo propertyInfo = type.GetProperty(dataRecord.Table.Columns[i].ColumnName);
28 Label endIfLabel = generator.DefineLabel();
29 if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
30 {
31 generator.Emit(OpCodes.Ldarg_0);
32 generator.Emit(OpCodes.Ldc_I4, i);
33 generator.Emit(OpCodes.Callvirt, isDBNullMethod);
34 generator.Emit(OpCodes.Brtrue, endIfLabel);
35 generator.Emit(OpCodes.Ldloc, result);
36 generator.Emit(OpCodes.Ldarg_0);
37 generator.Emit(OpCodes.Ldc_I4, i);
38 generator.Emit(OpCodes.Callvirt, getValueMethod);
39 generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
40 generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
41 generator.MarkLabel(endIfLabel);
42 }
43 }
44 generator.Emit(OpCodes.Ldloc, result);
45 generator.Emit(OpCodes.Ret);
46 dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load));
47 return dynamicBuilder;
48 }
49 }
对IL不太熟的人可能看这段代码会比较困难...但居然有人写好了拿来用就行了...有兴趣的人也可以去学习下MSIL指令.(目前我只发现用在这种地方还不错.其它地方一直找不到地方用..太麻烦了维护简直是恶梦)