根据Type 变量动态创建可变内部类型的泛型
来源:互联网 发布:淘宝跑腿服务靠谱吗 编辑:程序博客网 时间:2024/04/27 19:49
有的时候我们的泛型中的数据类型是动态变化的. 所以有的时候.我们需要.根据Type参数动态创建.不同内部类型的泛型
例如:List t = new List();
这里的 int 参数是需要根据情况动态变化的.
所以就出现了.
var rType = typeof(string);var genericType = typeof(List<>).MakeGenericType(rType);//这里的 genericType == typeof(List<string>)
看看下面这个牛B的泛型类型动态转换方法
/// <summary> /// 把字符串数组中的数据,转换成另外一种泛型类型. /// </summary> /// <param name="values"></param> /// <param name="t"></param> /// <returns></returns> public static dynamic TryParserArray(string[] values, Type t) { //string[] searchArray = value.Split(','); var genericType = typeof(List<>).MakeGenericType(t); var list = Activator.CreateInstance(genericType); var addMethod = genericType.GetMethod("Add"); foreach (var l in values) { try { var dValue = Convert.ChangeType(l, t); //dList.Add(dValue); addMethod.Invoke(list, new object[] { dValue }); } catch { } } return list; }
下面这个是链表版的.
/// <summary> /// 把字符串数组中的数据,转换成另外一种泛型类型. /// </summary> /// <param name="values"></param> /// <param name="t"></param> /// <returns></returns> public static dynamic TryParserArray(List<string> values, Type t) { //string[] searchArray = value.Split(','); var genericType = typeof(List<>).MakeGenericType(t); var list = Activator.CreateInstance(genericType); var addMethod = genericType.GetMethod("Add"); foreach (var l in values) { try { var dValue = Convert.ChangeType(l, t); //dList.Add(dValue); addMethod.Invoke(list, new object[] { dValue }); } catch { } } return list; }
使用示例
//使用在牛B闪闪的linq表达式中.实现 In 表达式 var Values = new List<string>(){"18","19","20"}; var rType = typeof(int); var genericType = typeof(List<>).MakeGenericType(rType);//等价于 typeof(List<int>) 只是,int可以根据Type动态改变了.更加灵活一些了. //用dynamic做装箱拆箱 var searchList = TryParserArray(Values, rType);//这里返回的是一个泛型链表.泛型内类型为 rType指定的类型. 类型已经变成了List<int>类型 if (searchList.Count > 0) { var elementList = Expression.Constant(searchList, genericType); //这个等价于 (p=> searchList.Contains(p.age)) 中的searchList //Expression convertExpression = Expression.Convert(p, rType); list.Add(Expression.Call(elementList, "Contains", null, p));//这个等价于 (p=> searchList.Contains(p.age)) 中的 searchList.Contains(p.age) }
2 0
- 根据Type 变量动态创建可变内部类型的泛型
- ABAP--动态创建局部类型的变量
- ABAP--动态创建局部类型的变量
- PHP中动态创建变量名(可变变量)
- C++根据变量动态创建二维数组
- [PHP]可变变量||动态变量
- 变量的存储类型、外部变量、static内部变量讲解
- 变量的内部存储:值和类型
- java动态参数列表即可变参数【可变的参数类型,也称为不定参数类型。英文缩写是varargus,还原一下就是variable argument type。】
- C# 中反射获取某类的子类和根据类型名动态创建对象(转载)
- ms sql根据表明变量动态创建表
- FlowLayout,根据数据数量动态添加内部的TextView
- 泛型类型Type的详解
- ABAP--动态创建类型和变量的使用程序样例
- PHP的可变变量
- PHP的可变变量
- PHP的可变变量
- const类型的成员函数内部如何改变成员变量
- 【mybatis】——简单程序示例
- 委托
- 支持ie8单选框与复选框自定义样式
- XSS学习总结
- Lombok 安装、入门 - 消除冗长的 java 代码
- 根据Type 变量动态创建可变内部类型的泛型
- 核电站问题(递推)
- java -- eclipse如何debug调试jdk源码
- 利用php截取字符去掉最后一个字符
- 强大的矩阵奇异值分解(SVD)及其应用
- 为何Redis要比Memcached好用
- ScrollView嵌套WebView导致网页图片不加载问题解决方法
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- 摄像机标定