zoukankan      html  css  js  c++  java
  • 当泛型的参数类型是动态的(转)

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
    出自:http://www.cnblogs.com/zhuweisky/archive/2007/04/26/728635.html
        在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如:
        IList<int> list = new List<int>();   集合IList的泛型参数是int类型,这在编译期就可以知道,于是,我们可以这样调用IList<>的Add方法:
        list.Add(6) ;
        如果泛型的参数类型是动态的了,也就是说,只有当程序运行起来后,才知道泛型参数的具体类型,其可能是int,也可能是string或其它。那该如何?使用反射,大家都知道这个答案,是的,使用反射可以解决问题,但是,反射就会有两个与身俱来的缺陷:一是丧失了强类型的好处,二是效率不高。

        还有一种更优雅的解决方案,那就是使用动态代理。针对上述的例子,我们首先定义一个非泛型的接口:
         /// <summary>
        /// ISimpleList 用于创建动态代理,将运行时的IList<>接口转换为静态的ISimpleList接口
        /// </summary>
        public interface ISimpleList
         {
            void Add(object element);
         }   然后,调用ESBasic.Emit.DynamicTypeEmitter类的static CreateDynamicProxy方法,创建动态代理实例,该动态代理实现了ISimpleList接口,接着便可以调用ISimpleList的Add方法来添加元素到集合中。         public static void CallAddDemo(Type listElementType ,object addedElement)
             {            
                Type closedGenericListType = typeof(List<>).MakeGenericType(listElementType);
                object list = Activator.CreateInstance(closedGenericListType);
                ISimpleList simpleList = (ISimpleList)DynamicTypeEmitter.CreateDynamicProxy<ISimpleList>(list);
               
                simpleList.Add(addedElement);
             }   动态代理解决方案的效率因素:
    (1)同一个动态代理类型只会生成一次,ESBasic会缓存生成的代理类型,以后便不会重复生成。
    (2)动态代理的方法的调用将直接转发(如 前面的ISimpleList.Add方法会直接转发给IList<>.Add),不会有反射的效率损失。
    (3)如果是值类型元素,那么可能会有box和unbox的性能损失;对于引用类型,则不存在。

       下载ESBasic.dll
  • 相关阅读:
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
    Visual Studio断点调试, 无法监视变量, 提示无法计算表达式
    ASP.NET MVC中MaxLength特性设置无效
    项目从.NET 4.5迁移到.NET 4.0遇到的问题
    发布网站时应该把debug设置false
    什么时候用var关键字
    扩展方法略好于帮助方法
    在基类构造器中调用虚方法需谨慎
    ASP.NET MVC中商品模块小样
    ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
  • 原文地址:https://www.cnblogs.com/netcorner/p/2912154.html
Copyright © 2011-2022 走看看