当前位置:开发工具->.NET ->回顾-------IOC容器与反射

原创版权标志回顾-------IOC容器与反射

作者:阿郎  发表时间:2018/4/16 14:47:12  阅读:
[摘要] 回顾-----------------------------IOC容器与反射
阿里云ECS服务器最低一个月只要7.8元

    对于反射,我想不用多说,好处与弊端都知道,对于弊端---耗费性能---的解决方案,应该也是知道的。可以采用委托或者表达式树,Emit等来实现。在这里我来说说委托的实现。任何对象都可以调用委托,只要方法返回值以及方法签名和委托声明一样就行。那么直接上代码吧:

    

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp6
{
 public delegate int DelegateCaculate(int a, int b);

 class Caculate
 {
 public int Add(int num1, int num2)
 {
 return num1 + num2;
 }

 public static int Substract(int num1, int num2)
 {
 return num2 - num1;
 }
 }

 class Program
 {
 static void Main(string[] args)
 {
 Caculate caculate = new Caculate();

 Type typeCaculate = typeof(Caculate);
 Type typeDelegate = typeof(DelegateCaculate);

 DelegateCaculate add = (DelegateCaculate)Delegate.CreateDelegate(typeDelegate, caculate, "Add");

 DelegateCaculate substract = (DelegateCaculate)Delegate.CreateDelegate(typeDelegate, typeCaculate, "Substract");

 Stopwatch sw = new Stopwatch();

 sw.Start();

 for(int i=0; i<10000; i++)
 {
 add(10, 20);
 substract(10, 20);
 }
 sw.Stop();
 Console.WriteLine("委托方式---总运行时间: " + sw.Elapsed);


 // 反射
 MethodInfo method = typeof(Caculate).GetMethod("Add", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
 

 if (method == null) return;

 object[] paras = { 10, 20 };
 object result = null;

 Stopwatch sww = new Stopwatch();
 sww.Start();
 for (int i=0; i<10000; i++)
 {
 result = method.Invoke(new Caculate(), paras);
 }
 sww.Stop();
 Console.WriteLine("反射方式----总运行时间: " + sww.Elapsed);

 //Console.WriteLine("Add:" + add(10, 20));
 //Console.WriteLine("Substract: " + substract(10, 20));

 Console.Read();
 }
 }
}

    运行结果:

    

    那么对于IOC容器呢?如果没有概念,请看我写的<<

    ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析

>>

    

    IoC框架最本质的东西:反射或者EMIT来实例化对象。然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否是单例对象还是每次都生成一个新的对象。具体的示例请参考上面链接里的代码

    

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)