`
soboer
  • 浏览: 1312007 次
文章分类
社区版块
存档分类
最新评论

当泛型的参数类型是动态的...

 
阅读更多
在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如:
IList<int>list=newList<int>();
集合IList的泛型参数是int类型,这在编译期就可以知道,于是,我们可以这样调用IList<>的Add方法:
list.Add(6) ;

如果泛型的参数类型是动态的了,也就是说,只有当程序运行起来后,才知道泛型参数的具体类型,其可能是int,也可能是string或其它。那该如何?使用反射,大家都知道这个答案,是的,使用反射可以解决问题,但是,反射就会有两个与身俱来的缺陷:一是丧失了强类型的好处,二是效率不高。

还有一种更优雅的解决方案,那就是使用动态代理。针对上述的例子,我们首先定义一个非泛型的接口:
///<summary>
///ISimpleList用于创建动态代理,将运行时的IList<>接口转换为静态的ISimpleList接口
///</summary>
publicinterfaceISimpleList
{
voidAdd(objectelement);
}
然后,调用ESBasic.Emit.DynamicTypeEmitter类的static CreateDynamicProxy方法,创建动态代理实例,该动态代理实现了ISimpleList接口,接着便可以调用ISimpleList的Add方法来添加元素到集合中。
publicstatic voidCallAddDemo(TypelistElementType,objectaddedElement)
{
TypeclosedGenericListType
=typeof(List<>).MakeGenericType(listElementType);
objectlist=Activator.CreateInstance(closedGenericListType);
ISimpleListsimpleList
=(ISimpleList)DynamicTypeEmitter.CreateDynamicProxy<ISimpleList>(list);

simpleList.Add(addedElement);
}
动态代理解决方案的效率因素:
(1)同一个动态代理类型只会生成一次,ESBasic会缓存生成的代理类型,以后便不会重复生成。
(2)动态代理的方法的调用将直接转发(如 前面的ISimpleList.Add方法会直接转发给IList<>.Add),不会有反射的效率损失。
(3)如果是值类型元素,那么可能会有box和unbox的性能损失;对于引用类型,则不存在。

下载ESBasic.dll
分享到:
评论

相关推荐

    C#泛型详解由入门到精通.docx

    目录 1. 泛型简介 2 1.1.理解泛型 2 1.2.泛型简介 3 ...3.泛型类型参数 4 4.类型参数的约束 5 5.泛型类 9 6.泛型接口 11 7.泛型方法 13 8.泛型委托 15 9.泛型代码中的默认关键字 17 10.泛型和属性 18

    C# 2.0中泛型编程初级入门教程.pdf

    本文讨论泛型使用的一般问题,比如为什么要使用泛型、泛型的编写方法、泛型中数据类型的约束、泛型 中静态成员使用要注意的问题、泛型中方法重载的问、泛型方法等,通过这些使我们可以大致了解泛型并掌握 泛型的一般...

    C#泛型参数多线程与复杂参数多线程2

    最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...

    java 泛型类的类型识别示例

    java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例

    java_泛型类相关介绍.docjava_泛型类相关介绍.doc

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。  Java语言引入泛型的好处是安全简单。  在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意...

    looly#hutool-site#泛型类型工具-TypeUtil1

    介绍获取方法的参数和返回值类型(包括Type和Class)获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)方法首先我们定义一个类:public cla

    C#泛型参数多线程与复杂参数多线程

    最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...

    c# 泛型类型参数与约束的深入分析

    泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“&lt;&gt;”内。泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用...

    java 带两个类型参数的泛型

    java 带两个类型参数的泛型 java 带两个类型参数的泛型

    泛型讲解 类型通配符

    泛型:就是在定义类,接口时指定类型形参, 这个类型形参将在声明变量,创建对象时确定(即实际传入的类型参数,也称为类型实参)

    Java源代码带两个类型参数的泛型的应用.rar

    Java源代码带两个类型参数的泛型的应用.rar

    Java如何获取泛型类型

    Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String ...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    定义泛型类:展示如何定义一个简单的泛型类,以及如何创建该类的实例并使用泛型参数。 泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,...

    Java 基础泛型.pdf

    Java泛型的核心思想是类型参数化,即在类、接口或方法的定义中使用类型参数来代替具体的类型,这些类型参数在实例化时被具体类型替换,从而实现了通用性和类型安全。 主要特性包括 1. 类型参数:在类、接口或方法的...

    你不知道的JAVA高级应用

    1.泛型的范围,可以约束泛型的类型. 2.反射,暴力反射,和静态做斗争,暴力反射,setAccessible 无论公有私有都可以用来访问 3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据...

    java 用泛型参数类型构造数组详解及实例

    主要介绍了java 用泛型参数类型构造数组详解及实例的相关资料,需要的朋友可以参考下

    泛型与集合类.pdf

    Java中参数化类型。以集合为例,集合可以使用泛型限制被添加元素的数据类型,若将不符合指定数据类型的元素添加到集合类,编译器会报错。。。。

    whlmpower#JavaNote#获取泛型参数的实际类型及反序列化1

    获取泛型参数的实际类型}//获取此类的父类的第一个泛型参数的实际类型对应于实际的类型PayResultHandler,其父类HPWallletCallBackH

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

    Generic_3(泛型限定(下限)-泛型限定(上限的体现)-泛型限定(下限的体现)-泛型限定(通配符的体现)-集合查阅的技巧)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

Global site tag (gtag.js) - Google Analytics