ASP.NET编程:使用表达式树构建托付改良反射功能仓酷云
觉得J2EE好像有很多工具,比如servlet,jboss,tomcat,ejb什么的,可是微软的.NET怎么什么也没有啊?比来弄一个体系时因为在对照关头中央用到反射了,以是要存眷了一下反射的功能成绩。搜刮一下,不难搜到老赵的这篇文章,上面是一些混乱的条记。(倡议先看老赵的文章).Net4.0反射功能改良
看老赵的文章,老赵失掉的了局是如许的:
00:00:00.0125539(Directlyinvoke)
00:00:04.5349626(Reflectioninvoke)
00:00:00.0322555(Dynamicexecutor)
而我把代码弄上去本人运转失掉如许的了局:
1
2
3
00:00:00.0009710(Directlyinvoke)
00:00:00.4142893(Reflectioninvoke)
00:00:00.0194501(Dynamicexecutor)
这里不是说呆板功能形成相对的工夫,而是差异比例完整纷歧样,想了一阵想起了老赵事先应当是基于.Net3.5,判断把程序的方针框架切换到.Net3.5,了局以下:
1
2
3
00:00:00.0018801(Directlyinvoke)
00:00:02.4288876(Reflectioninvoke)
00:00:00.0141537(Dynamicexecutor)
三者的差异仍旧有些纷歧样,老赵何处的间接挪用与静态实行统一数目级的了局仍是没有。但发明了另外一些信息。反射和间接挪用办法.Net4.0比.Net3.5有十分年夜的改良,出格是反射,功能提拔了好几倍。反而构建表达式树静态挪用的体例功能比.Net3.5差了一点。可是绝对反射仍是有差异,依照这个比例,写写表达式树仍是值得的。
改良老赵的DynamicMethodExecutor
老赵的那篇的文章的思绪是利用DynamicMethodExecutor来机关一个全能的托付Func
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
///<summary>
///静态机关托付
///</summary>
///<paramname="methodInfo">办法元数据</param>
///<returns>托付</returns>
publicstaticDelegateBuildDynamicDelegate(MethodInfomethodInfo)
{
if(methodInfo==null)
thrownewArgumentNullException("methodInfo");
varparamExpressions=methodInfo.GetParameters().Select((p,i)=>
{
varname="param"+(i+1).ToString(CultureInfo.InvariantCulture);
returnExpression.Parameter(p.ParameterType,name);
}).ToList();
MethodCallExpressioncallExpression;
if(methodInfo.IsStatic)
{
//Call(params....)
callExpression=Expression.Call(methodInfo,paramExpressions);
}
else
{
varinstanceExpression=Expression.Parameter(methodInfo.ReflectedType,"instance");
//insatnce.Call(params….)
callExpression=Expression.Call(instanceExpression,methodInfo,paramExpressions);
paramExpressions.Insert(0,instanceExpression);
}
varlambdaExpression=Expression.Lambda(callExpression,paramExpressions);
returnlambdaExpression.Compile();
}
利用时转换为强范例的托付便可:
1
2
varaction=(Action<TInstance,T1,T2>)BuildDynamicDelegate(methodInfo);
varfunc=(Func<TInstance,T1,T2,TReturn>)BuildDynamicDelegate(methodInfo);
老赵谁人托付都是object,利用时的范例转换,另有装箱,拆箱城市有必定的功能丧失,而强范例就没有这个成绩。
起首在老赵的那篇文章上一个办法改成两个办法,然后测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
privatestaticvoidDynamicExecutor_ObjectType()
{
<p> 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦! 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
页:
[1]