当泛型的参数类型是动态的...
来源:互联网 发布:系统还原软件哪个好用 编辑:程序博客网 时间:2024/06/15 21:42
在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如:
如果泛型的参数类型是动态的了,也就是说,只有当程序运行起来后,才知道泛型参数的具体类型,其可能是int,也可能是string或其它。那该如何?使用反射,大家都知道这个答案,是的,使用反射可以解决问题,但是,反射就会有两个与身俱来的缺陷:一是丧失了强类型的好处,二是效率不高。
还有一种更优雅的解决方案,那就是使用动态代理。针对上述的例子,我们首先定义一个非泛型的接口:
(1)同一个动态代理类型只会生成一次,ESBasic会缓存生成的代理类型,以后便不会重复生成。
(2)动态代理的方法的调用将直接转发(如 前面的ISimpleList.Add方法会直接转发给IList<>.Add),不会有反射的效率损失。
(3)如果是值类型元素,那么可能会有box和unbox的性能损失;对于引用类型,则不存在。
下载ESBasic.dll
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方法来添加元素到集合中。/// ISimpleList 用于创建动态代理,将运行时的IList<>接口转换为静态的ISimpleList接口
/// </summary>
public interface ISimpleList
{
void Add(object element);
}
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);
}
动态代理解决方案的效率因素:{
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
- 当泛型的参数类型是动态的...
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 泛型的动态参数类型使用介绍
- java动态参数列表即可变参数【可变的参数类型,也称为不定参数类型。英文缩写是varargus,还原一下就是variable argument type。】
- 当方法参数是“对象”时的深刻理解
- Yii Html::a 当参数是数组的时候
- 当函数的参数为int类型 调用该函数是给该参数赋值null会报空指针异常nullpointexception
- 方法参数是基本类型和引用类型的区别
- 读取参数类型是一个对象的参数值
- 形式参数是引用类型的时候 返回值类型是引用类型的时候
- 动态泛类型,泛类型动态参数
- javascript function传递 参数当参数是 字符串 如何拼接(有些参数是通过变量得到的) 如何拼接
- 类型“string”必须是不可以为 null 值的类型才能用作泛型类型或方法“System.Nullable<T>”中的参数“T”
- 引用传递的参数类型,加不加ref是不同的
- 引用传递的参数类型,加不加ref是不同的
- 引用传递的参数类型,加不加ref是不同的 .
- Objective-c - 当属性的类型是oc对象的时候,setter方法的写法
- 怎样获得泛型的类型参数
- DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!
- SQL Server 经验 (转载)
- Socket与拔掉网线
- 通过Spring.net发布Remoting
- 动态代理DynamicProxy 介绍
- 当泛型的参数类型是动态的...
- DataRabbit的背后(1)-―走进DataRabbit上下文
- 框架?
- DataRabbit 轻量的数据访问框架(12)-- 将DataRabbit融入架构
- 我的架构经验小结(三)-- 深入三层架构
- DataRabbit 轻量的数据访问框架(10) -- IPagerManager
- DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser
- DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和TransactionScope
- DataRabbit 轻量的数据访问框架(07) -- ISPAccesser