在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如:
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泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中...
综上所述,动态初始化类提供了运行时的灵活性,参数泛型化增强了代码的类型安全和重用性,而统一返回值则促进了代码的整洁和可维护性。理解并熟练运用这些技术,对于提升Java编程的质量和效率至关重要。在实际开发...
在上面的`swap`函数中,`T`就是泛型变量,它代表了传入函数的参数类型。 泛型类则是在类定义中使用泛型。这样,类可以具有与泛型相关的成员,如属性或方法,它们可以处理多种类型的值。下面是一个简单的泛型栈类的...
在 Java 7 中,当创建一个泛型实例时,如果该实例的类型已经在上下文中明确声明过,则可以省略泛型参数。例如: ```java Map, String> myMap = new HashMap(); // 编译器自动推断类型 ``` 然而,Java 7 的类型推断...
当子类继承泛型父类并指定具体的类型参数时,子类就变成了非泛型类。例如: ```java public class ConcreteChild extends GenericClass<String> { // ... } ``` 在这种情况下,`ConcreteChild`类只能处理`...
泛型在这里可以确保这些函数可以处理任何类型的事件参数,无论它们是基本类型还是自定义类型。动态数组在这里可能被用来存储和传递钩子回调函数的参数或结果。 在"BeaEngine64.obj"和"BeaEngine32.obj"中,我们看到...
"泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...
泛型允许我们在定义类、接口和方法时使用一个或多个类型参数,这些参数会在实际使用时被具体的类型替换。通过泛型,我们可以创建通用的数据结构,如集合和队列,而无需为每种可能的数据类型编写单独的实现。 在C#中...
但是,可以在泛型类中定义泛型静态方法,这种情况下方法内部使用的泛型参数是独立于类实例的泛型参数的。 泛型相关面试题: Java中的泛型是参数化类型的一种机制,它允许在编译时就进行类型检查,提高代码的复用性...
- 在C#中,可以通过在类、接口、方法或属性的声明前添加类型参数列表来定义泛型类型。 - 类型参数列表使用尖括号`< >`包围,可以包含一个或多个类型参数。 ```csharp public class Stack<T> { ... } ``` 2. **...
当不使用泛型时,如示例所示,我们可能需要手动进行类型转换,如果转换错误,程序会在运行时抛出异常。而使用泛型类型,编译器会自动确保数据类型的安全性,无需手动转换,增强了代码的可靠性。 然而,Java的泛型有...
泛型是Java编程中的一项重要特性,它允许我们在定义类、接口、方法时使用类型参数,从而实现更灵活、安全的代码设计。泛型的主要目的是提高类型安全性,减少强制类型转换,以及提供编译时的类型约束。 在传统的Java...
在这个例子中,`Container<T>`是一个泛型接口,`T`是一个类型参数,它代表了接口中`value`属性和`setValue`方法参数的类型。我们可以根据需要将`T`替换为具体的类型,如`string`或`number`。 接下来,我们讨论泛型...
泛型方法允许在方法级别定义类型参数,例如`public T Clone(T obj)`,该方法可以对任何类型进行克隆操作。泛型方法通常用于需要处理多种数据类型,但操作逻辑相同的场景。 四、泛型约束 在.NET中,可以对类型参数...
Java 泛型是一种强大的语言特性,它允许在类、接口和方法中使用类型参数,以实现类型的安全性和代码的重用性。泛型是 Java 从 JDK 5.0 版本开始引入的重要特性,目的是增强类型系统,提高程序的类型安全性,减少运行...
在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList<T>`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...
泛型允许我们在定义类、接口和方法时指定一个或多个类型参数,从而实现参数化类型。这样,我们可以在编译时期进行类型检查,避免了运行时的ClassCastException异常。 在不使用泛型的情况下,如示例中的`List list1 ...
首先,泛型的基本概念是为类、接口和方法定义一种类型参数,使得在编译期间可以进行类型检查,防止在运行时出现ClassCastException。泛型的语法通常以尖括号表示,例如`List<T>`,这里的`T`就是一个类型参数,代表一...
Action参数化中,`someaction`关键字用于定义操作或用户自定义的函数、过程,提供了一种将行为作为泛型参数的方式,增强了泛型的动态性和可扩展性。 ADT参数化则允许将自定义的数据结构作为泛型参数,使得泛型能够...
当我们已经通过`MakeGenericType`创建了具体化的泛型类型后,我们可以使用`CreateInstance`来实例化这个类型。例如: ```csharp Type concreteType = typeof(MyGenericClass).MakeGenericType(typeof(string)); ...