`
feipigwang
  • 浏览: 783919 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如:
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
分享到:
评论

相关推荐

    Java泛型的用法及T.class的获取过程解析

    Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中...

    动态初始化类+参数泛型化+统一返回值.zip

    综上所述,动态初始化类提供了运行时的灵活性,参数泛型化增强了代码的类型安全和重用性,而统一返回值则促进了代码的整洁和可维护性。理解并熟练运用这些技术,对于提升Java编程的质量和效率至关重要。在实际开发...

    TypeScript中的泛型 泛型变量 泛型类.zip

    在上面的`swap`函数中,`T`就是泛型变量,它代表了传入函数的参数类型。 泛型类则是在类定义中使用泛型。这样,类可以具有与泛型相关的成员,如属性或方法,它们可以处理多种类型的值。下面是一个简单的泛型栈类的...

    Java8新特性探究-泛型的目标类型推断.doc

    在 Java 7 中,当创建一个泛型实例时,如果该实例的类型已经在上下文中明确声明过,则可以省略泛型参数。例如: ```java Map, String&gt; myMap = new HashMap(); // 编译器自动推断类型 ``` 然而,Java 7 的类型推断...

    Java源码泛型类的继承应用.rar

    当子类继承泛型父类并指定具体的类型参数时,子类就变成了非泛型类。例如: ```java public class ConcreteChild extends GenericClass&lt;String&gt; { // ... } ``` 在这种情况下,`ConcreteChild`类只能处理`...

    Delphi泛型动态数组的扩展.3.rar

    泛型在这里可以确保这些函数可以处理任何类型的事件参数,无论它们是基本类型还是自定义类型。动态数组在这里可能被用来存储和传递钩子回调函数的参数或结果。 在"BeaEngine64.obj"和"BeaEngine32.obj"中,我们看到...

    泛型讲解 类型通配符

    "泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...

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

    泛型允许我们在定义类、接口和方法时使用一个或多个类型参数,这些参数会在实际使用时被具体的类型替换。通过泛型,我们可以创建通用的数据结构,如集合和队列,而无需为每种可能的数据类型编写单独的实现。 在C#中...

    泛型需要注意的问题.pdf

    但是,可以在泛型类中定义泛型静态方法,这种情况下方法内部使用的泛型参数是独立于类实例的泛型参数的。 泛型相关面试题: Java中的泛型是参数化类型的一种机制,它允许在编译时就进行类型检查,提高代码的复用性...

    C#-20中泛型编程初级入门教程.docx

    - 在C#中,可以通过在类、接口、方法或属性的声明前添加类型参数列表来定义泛型类型。 - 类型参数列表使用尖括号`&lt; &gt;`包围,可以包含一个或多个类型参数。 ```csharp public class Stack&lt;T&gt; { ... } ``` 2. **...

    java泛型深入[参照].pdf

    当不使用泛型时,如示例所示,我们可能需要手动进行类型转换,如果转换错误,程序会在运行时抛出异常。而使用泛型类型,编译器会自动确保数据类型的安全性,无需手动转换,增强了代码的可靠性。 然而,Java的泛型有...

    JAVA泛型详解[参考].pdf

    泛型是Java编程中的一项重要特性,它允许我们在定义类、接口、方法时使用类型参数,从而实现更灵活、安全的代码设计。泛型的主要目的是提高类型安全性,减少强制类型转换,以及提供编译时的类型约束。 在传统的Java...

    TypeScript的泛型接口 泛型类接口.zip

    在这个例子中,`Container&lt;T&gt;`是一个泛型接口,`T`是一个类型参数,它代表了接口中`value`属性和`setValue`方法参数的类型。我们可以根据需要将`T`替换为具体的类型,如`string`或`number`。 接下来,我们讨论泛型...

    深入浅出_NET泛型编程_.files.rar

    泛型方法允许在方法级别定义类型参数,例如`public T Clone(T obj)`,该方法可以对任何类型进行克隆操作。泛型方法通常用于需要处理多种数据类型,但操作逻辑相同的场景。 四、泛型约束 在.NET中,可以对类型参数...

    java泛型详解java泛型详解.doc

    Java 泛型是一种强大的语言特性,它允许在类、接口和方法中使用类型参数,以实现类型的安全性和代码的重用性。泛型是 Java 从 JDK 5.0 版本开始引入的重要特性,目的是增强类型系统,提高程序的类型安全性,减少运行...

    解析Java泛型的类型擦除.pdf

    在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList&lt;T&gt;`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...

    java泛型深入[参考].pdf

    泛型允许我们在定义类、接口和方法时指定一个或多个类型参数,从而实现参数化类型。这样,我们可以在编译时期进行类型检查,避免了运行时的ClassCastException异常。 在不使用泛型的情况下,如示例中的`List list1 ...

    一个简单的Java控制台关于泛型的银行操作系统.rar

    首先,泛型的基本概念是为类、接口和方法定义一种类型参数,使得在编译期间可以进行类型检查,防止在运行时出现ClassCastException。泛型的语法通常以尖括号表示,例如`List&lt;T&gt;`,这里的`T`就是一个类型参数,代表一...

    Apla→Java程序生成系统中泛型机制实现方法研究.pdf

    Action参数化中,`someaction`关键字用于定义操作或用户自定义的函数、过程,提供了一种将行为作为泛型参数的方式,增强了泛型的动态性和可扩展性。 ADT参数化则允许将自定义的数据结构作为泛型参数,使得泛型能够...

    泛型MakeGeneric方法应用实例.rar

    当我们已经通过`MakeGenericType`创建了具体化的泛型类型后,我们可以使用`CreateInstance`来实例化这个类型。例如: ```csharp Type concreteType = typeof(MyGenericClass).MakeGenericType(typeof(string)); ...

Global site tag (gtag.js) - Google Analytics