C#语法糖之 ReflectionSugar 通用反射类
用法很简单:
ReflectionSugar rs = new ReflectionSugar(100);//缓存100秒 ,可以不填默认不缓存
rs.有嘛点嘛
性能测试:
性能测试类源码:
http://www.cnblogs.com/sunkaixuan/p/4540840.html
- using SyntacticSugar;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace Test.IO
- {
- public partial class ReflectionTest : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //性能测试类
- PerformanceTest p = new PerformanceTest();
- p.SetCount(100000);//循环次数(默认:1)
- p.SetIsMultithread(false);//是否启动多线程测试 (默认:false)
- /******************************CreateInstance********************************/
- //带cache
- p.Execute(
- i =>
- {
- CreateInstanceByCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:0.09901秒
- //不带cache
- p.Execute(
- i =>
- {
- CreateInstanceNoCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:0.32002秒
- /******************************ExecuteMethod********************************/
- //带cache
- p.Execute(
- i =>
- {
- ExecuteMethodByCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:0.36202秒
- //不带cache
- p.Execute(
- i =>
- {
- ExecuteMethodNoCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:1.35508秒
- /******************************ExecuteMethod********************************/
- //带cache
- p.Execute(
- i =>
- {
- ExecuteMethodByCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:0.36202秒
- //不带cache
- p.Execute(
- i =>
- {
- ExecuteMethodNoCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:1.35508秒
- /******************************LoadFile********************************/
- //带cache
- p.Execute(
- i =>
- {
- LoadFileByCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:0.11801
- //不带cache
- p.Execute(
- i =>
- {
- LoadFileNoCache();//调用函数
- },
- message => { Response.Write(message); }); //总共执行时间:4.89628秒
- //还有其它方法就不测试了
- }
- //获取实列
- private static void CreateInstanceByCache()
- {
- ReflectionSugar rs = new ReflectionSugar(100);//缓存100秒
- var f = rs.CreateInstance<FileSugar>("SyntacticSugar.FileSugar", "SyntacticSugar");
- }
- //获取实列
- private static void CreateInstanceNoCache()
- {
- string path = "SyntacticSugar.FileSugar,SyntacticSugar";//命名空间.类型名,程序集
- Type o = Type.GetType(path);//加载类型
- FileSugar obj = (FileSugar)Activator.CreateInstance(o, true);//根据类型创建实例
- }
- //执行函数
- private static void ExecuteMethodByCache()
- {
- ReflectionSugar rs = new ReflectionSugar(100);//缓存100秒
- var path = rs.ExecuteMethod("SyntacticSugar", "FileSugar", "GetMapPath", "~/");
- }
- //执行函数
- private static void ExecuteMethodNoCache()
- {
- ReflectionSugar rs = new ReflectionSugar(0);//缓存0秒
- var path = rs.ExecuteMethod("SyntacticSugar", "FileSugar", "GetMapPath", "~/");
- }
- //加载程序集
- private static void LoadFileByCache()
- {
- ReflectionSugar rs = new ReflectionSugar(100);//缓存100秒
- Assembly ams = rs.LoadFile(@"D:\学习\SyntacticSugar\SyntacticSugar\bin\Debug\SyntacticSugar.dll");
- }
- //加载程序集
- private static void LoadFileNoCache()
- {
- ReflectionSugar rs = new ReflectionSugar(0);//缓存100秒
- Assembly ams = rs.LoadFile(@"D:\学习\SyntacticSugar\SyntacticSugar\bin\Debug\SyntacticSugar.dll");
- }
- }
- }
反射类源码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Web;
- using System.Web.Caching;
- namespace SyntacticSugar
- {
- /// <summary>
- /// ** 描述:反射通用类
- /// ** 创始时间:2010-2-28
- /// ** 修改时间:-
- /// ** 修改人:sunkaixuan
- /// ** 使用说明: http://www.cnblogs.com/sunkaixuan/p/4635710.html
- /// </summary>
- public class ReflectionSugar
- {
- public static int Minutes = 60;
- public static int Hour = 60 * 60;
- public static int Day = 60 * 60 * 24;
- private int _time = 0;
- private bool _isCache { get { return _time > 0; } }
- /// <summary>
- /// 缓存时间,0为不缓存(默认值:0秒,单位:秒)
- /// </summary>
- public ReflectionSugar(int time = 0)
- {
- _time = time;
- }
- /// <summary>
- /// 创建对象实例
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="fullName">命名空间.类型名</param>
- /// <param name="assemblyName">程序集(dll名称)</param>
- /// <returns></returns>
- public T CreateInstance<T>(string fullName, string assemblyName)
- {
- string key = GetKey("CreateInstance1", fullName, assemblyName);
- if (_isCache)
- if (ContainsKey(key))
- {
- return Get<T>(key);
- }
- string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
- Type o = Type.GetType(path);//加载类型
- object obj = Activator.CreateInstance(o, true);//根据类型创建实例
- var reval = (T)obj;
- if (_isCache)
- Add<T>(key, reval, _time);
- return reval;//类型转换并返回
- }
- /// <summary>
- /// 创建对象实例
- /// </summary>
- /// <typeparam name="T">要创建对象的类型</typeparam>
- /// <param name="assemblyName">类型所在程序集名称(dll名称)</param>
- /// <param name="nameSpace">类型所在命名空间</param>
- /// <param name="className">类型名</param>
- /// <returns></returns>
- public T CreateInstance<T>(string assemblyName, string nameSpace, string className)
- {
- string key = GetKey("CreateInstance2", assemblyName, nameSpace, className);
- if (_isCache)
- if (ContainsKey(key))
- {
- return Get<T>(key);
- }
- try
- {
- string fullName = nameSpace + "." + className;//命名空间.类型名
- //此为第一种写法
- object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
- var reval = (T)ect;//类型转换并返回
- if (_isCache)
- Add<T>(key, reval, _time);
- return reval;
- //下面是第二种写法
- //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
- //Type o = Type.GetType(path);//加载类型
- //object obj = Activator.CreateInstance(o, true);//根据类型创建实例
- //return (T)obj;//类型转换并返回
- }
- catch
- {
- //发生异常,返回类型的默认值
- var reval = default(T);
- if (_isCache)
- Add<T>(key, reval, _time);
- return reval;//类型转换
- }
- }
- /// <summary>
- /// 加载程序集
- /// </summary>
- /// <param name="path"></param>
- /// <returns></returns>
- public Assembly LoadFile(string path)
- {
- string key = GetKey("LoadFile", path);
- if (_isCache)
- if (ContainsKey(key))
- {
- return Get<Assembly>(key);
- }
- Assembly asm = Assembly.LoadFile(path);
- if (_isCache)
- Add<Assembly>(key, asm, _time);
- return asm;
- }
- /// <summary>
- /// 获取类型根据程序集
- /// </summary>
- /// <param name="asm">Assembly对象</param>
- /// <returns></returns>
- public Type GetTypeByAssembly(Assembly asm, string nameSpace, string className)
- {
- string key = GetKey("GetTypeByAssembly", nameSpace, className);
- if (_isCache)
- if (ContainsKey(key))
- {
- return Get<Type>(key);
- }
- Type type = asm.GetType(nameSpace + "." + className);
- if (_isCache)
- Add<Type>(key, type, _time);
- return type;
- }
- /// <summary>
- /// 返回当前 System.Type 的所有公共属性。
- /// </summary>
- /// <param name="type"></param>
- /// <returns></returns>
- public PropertyInfo[] GetProperties(Type type)
- {
- string key = GetKey("GetProperties", type.FullName);
- if (_isCache)
- if (ContainsKey(key))
- {
- return Get<PropertyInfo[]>(key);
- }
- var reval = type.GetProperties();
- if (_isCache)
- Add<PropertyInfo[]>(key, reval, _time);
- return reval;
- }
- /// <summary>
- /// 根据字符执行方法
- /// </summary>
- /// <param name="nameSpace">命名空间</param>
- /// <param name="className">类名</param>
- /// <param name="MethodName">方法名</param>
- /// <param name="parameters">参数</param>
- /// <returns>返回object类型</returns>
- public object ExecuteMethod(string nameSpace, string className, string MethodName, params object[] parameters)
- {
- string key = GetKey("ExecuteMethod", nameSpace, className, MethodName, parameters.Length.ToString());
- MethodInfo methodinfo = null;
- if (_isCache&&ContainsKey(key))
- {
- methodinfo = Get<MethodInfo>(key);
- }
- else
- {
- //动态从程序集中查找所需要的类并使用系统激活器创建实例最后获取它的Type
- Type type = Assembly.Load(nameSpace).CreateInstance(nameSpace + "." + className).GetType();
- //定义参数的个数,顺序以及类型的存储空间;
- Type[] parametersLength;
- if (parameters != null)
- {
- //如果有参数创建参数存储空间并依次设置类型
- parametersLength = new Type[parameters.Length];
- int i = 0;
- foreach (object obj in parameters)
- {
- parametersLength.SetValue(obj.GetType(), i);
- i++;
- }
- }
- else
- {
- //没有参数就为空
- parametersLength = new Type[0];
- }
- //查找指定的方法
- methodinfo = type.GetMethod(MethodName, parametersLength);
- if (_isCache)
- Add<MethodInfo>(key, methodinfo, _time);
- }
- //如果是静态方法就执行(非静态我没试过)
- if (methodinfo.IsStatic)
- {
- //调用函数
- return methodinfo.Invoke(null, parameters);
- }
- return null;
- }
- #region helper
- private string GetKey(params string[] keyElementArray)
- {
- return string.Join("", keyElementArray);
- }
- /// <summary>
- /// 插入缓存
- /// </summary>
- /// <param name="key"> key</param>
- /// <param name="value">value</param>
- /// <param name="cacheDurationInSeconds">过期时间单位秒</param>
- private void Add<V>(string key, V value, int cacheDurationInSeconds)
- {
- Add(key, value, cacheDurationInSeconds, CacheItemPriority.Default);
- }
- /// <summary>
- /// 插入缓存.
- /// </summary>
- /// <param name="key">key</param>
- /// <param name="value">value</param>
- /// <param name="cacheDurationInSeconds">过期时间单位秒</param>
- /// <param name="priority">缓存项属性</param>
- private void Add<V>(string key, V value, int cacheDurationInSeconds, CacheItemPriority priority)
- {
- string keyString = key;
- HttpRuntime.Cache.Insert(keyString, value, null, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);
- }
- /// <summary>
- /// 插入缓存.
- /// </summary>
- /// <param name="key">key</param>
- /// <param name="value">value</param>
- /// <param name="cacheDurationInSeconds">过期时间单位秒</param>
- /// <param name="priority">缓存项属性</param>
- private void Add<V>(string key, V value, int cacheDurationInSeconds, CacheDependency dependency, CacheItemPriority priority)
- {
- string keyString = key;
- HttpRuntime.Cache.Insert(keyString, value, dependency, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);
- }
- /// <summary>
- /// key是否存在
- /// </summary>
- /// <param name="key">key</param>
- /// <returns> /// 存在<c>true</c> 不存在<c>false</c>. /// /// </returns>
- private bool ContainsKey(string key)
- {
- return HttpRuntime.Cache[key] != null;
- }
- /// <summary>
- ///获取Cache根据key
- /// </summary>
- private V Get<V>(string key)
- {
- return (V)HttpRuntime.Cache[key];
- }
- #endregion
- //PropertyInfo GET SET说明
- //T.GetProperty("key").GetValue(obj, null); //read a key value
- //T.GetProperty("key").SetValue(obj, "", null); //write a value to key
- ////注意如果是字典
- //T.GetProperty("Item").GetValue(obj, new [] {"id"}); //先拿Item 然后才通过 new[] {这里放指定的key}
- }
- }
总结:
只要不反射外部DLL文件缓存可以提高3倍性能,如果是反射外部DLL文件可以提高40倍以上,这只是我的测试结果 循环次数超多性能差距越大
C#语法糖之 ReflectionSugar 通用反射类的更多相关文章
- ReflectionSugar 通用反射类
http://www.cnblogs.com/sunkaixuan/p/4635710.html
- Scala的apply unapply unapplySeq 语法糖
apply 可以理解为注入 unapply unapplySeq 可以理解为提取 apply 与 unapply 虽然名字相近,但是使用起来区别挺大.apply有点像构造函数unapply主要是结合模 ...
- Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射
1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- 看看C# 6.0中那些语法糖都干了些什么(中篇)
接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...
- C# 6.0新特性---语法糖
转载:http://www.cnblogs.com/TianFang/p/3928172.html 所谓语法糖就是在编译器里写做文章,达到简化代码书写的目的,要慎重使用,省略过多不易理解. NULL检 ...
- 语法糖----JAVA
语法糖 语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这种语法能使程序 ...
- 语法糖(Syntactic sugar)
语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添 ...
- 早期(编译器)优化--Java语法糖的味道
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...
随机推荐
- DNS劫持
忽然发现我最喜欢的chrome 一直有广告,好些论坛都有大量的广告,原以为是重了什么插件了,找了也没发现,有可能是DNS劫持. 打开路由器,找到 dns 设置里面把里面的全部去掉.然后把 192.16 ...
- json字符串转成 Map/List
package jsonToMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import n ...
- Gradle 构建 android 应用常见问题解决指南
前言 android gradle 插件已经发展到0.5.7,同时gradle 本身也到了1.8,相比两个月前,android gradle 更快,更完善,也更好用了,为了让各位androider 早 ...
- asp.net 后台实现删除,划掉效果
效果: name = "<S>" + fircon + "</br>" + "</S>"; 增加“< ...
- 用飞信监控GoldenGate进程
监控GoldenGate进程 1) 在goldengate安装目录下建立文件ogginfo $vim ogginfo info all 2) 配置飞信报警 ...
- 阿里云 Redis 服务遇到的问题
ERR unknown command eval 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: St ...
- sql读取xml
DECLARE @ItemMessage XML SET @ItemMessage=cast(N'<?xml version="1.0" encoding="utf ...
- 做最好的日期控件,My97 DatePicker 4.8 Beta4
4.8更新的内容 [新增]preload预载选项 [新增]时分秒选择菜单的定制功能,详见hmsMenuCfg属性[beta4] [新增]$dp.unbind函数,允许用户手动接触日期控件绑定[beta ...
- MySql批量更新方法
准备数据 表 user(用户).dept(部门) 1:更新符合单个条件的某个字段的一条数据 update user u set u.name = '测试' where u.id = "&qu ...
- 实例学习Backbone.js(一)
前面有两篇文章介绍了Backbone的model.collection和view,那么接下来我想用一个完整的Demo来记录我学习的过程, 单页操作,实现数据的增删改,后台使用json做数据库,通过re ...