|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
觉得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> |
|