【C#】访问泛型中的List列表数据
光看标题的确不好说明问题,下面描述一下问题场景:
已知后端自定义的返回的Json数据结构如下:
response:
{
"message": "返回成功",
"result":
[
{
"name":"AAA",
"age":16
},
{
"name":"BBB",
"age":17
}
],
"state": 1
}
显然,根据Json的结构,客户端可以自定义一个类来描述请求的相应结果。
public class Response<T>
{
public string message { get; set; }
public ObservableCollection<T> result { get; set; }
public int state { get; set; }
}
其中response.result内容是一个数组。为了通用性使用泛型T来描述数组中元素的类型(即用T来表示相应的实体类)。如本例中的元素类型描述为Student类。
public class Student
{
public string name{ get; set; }
public int age{ get; set; }
}
现在,如果返回的Response类型为Student,而Student类中又包含了一个存储其他类型的List列表,即Student实体类变成了如下:
response:
{
"message": "返回成功",
"result":
[
{
"name":"AAA",
"list":
[
{
...
},
{
...
}
]
"age":16
},
{
"name":"BBB",
"list":
[
{
...
},
{
...
}
]
"age":17
}
],
"state": 1
}
那么对应的Student实体类就要新增一个List列表,变成如下:
public class Student
{
public string name{ get; set; }
public int age{ get; set; }
public ObservableCollection<Achievement> list { set; get; } // 假设业务逻辑是实体类是学生的成绩
}
问题:
- 如果后台返回的数据,是一组T类型的数组,而该T类型中又包含了一个S类型的列表,该如何访问该列表?
- 换句话说,如何访问泛型类型中的列表?
下面的例子演示如何访问泛型中的列表数据,并用一个新的引用来保存该列表的数据。为了通用性,使用了泛型和反射。
public class MyClass
{
public ObservableCollection<Achievement> AchievementList; // 用于记录Student中的List列表的内容
/// <summary>
/// response.result只有唯一元素,获取该元素中的【唯一】列表数据
/// </summary>
/// <typeparam name="T">唯一元素的类型</typeparam>
/// <typeparam name="S">唯一元素中的指定列表属性中,保存的实体类类型</typeparam>
/// <param name="proName">本类中保存返回的唯一元素的列表的引用</param>
/// <param name="listName">元素中的【唯一】列表的属性名,看实体类</param>
/// <param name="callback ">如果有回调,就在完成数据获取后执行该回调</param>
public void GetListDataInResult<T, S>(string proName, string listName, Action callback = null) where T : class
{
// 在调用该方法之前,已经获得了Response数据!
// 获得response.result中的数据
T item = response.result[0]; // response.result是个数组,但里面只有一个Student元素
// 反射出该元素的实体类,即本例中的Student类
Type t = item.GetType();
// 获得该元素中的List列表数据
PropertyInfo listPropertyInfo = t.GetProperty(listName);
ObservableCollection<S> sourceList = (ObservableCollection<S>)listPropertyInfo.GetValue(response.result[0], null); // 本文的重点
// 给本类中的保存该列表的引用赋值
PropertyInfo list = this.GetType().GetProperty(proName);
list.SetValue(this, sourceList);
// 如果有回调,就在完成数据获取后执行该回调
callback?.Invoke();
}
}
调用上面的方法:
GetListDataInResult<Student, Achievement>("AchievementList", "list", null);
【C#】访问泛型中的List列表数据的更多相关文章
- [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据
目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...
- iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...
- ASP.NET MVC3快速入门——第五节、从控制器访问模型中的数据
5.1 从控制器访问模型中的数据在本节中,我们将创建一个新的MoviesController类,并且书写代码来获取数据库中的数据,并通过视图模板来显示在浏览器中.鼠标右击Controller文件夹,点 ...
- Spring.NET 中的 ADO.NET 数据访问的示例
Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...
- Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 1)
本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据.几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基 ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)
(五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打 ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- 从mysql中拿到的数据构造为列表
最近测试接口遇到一个问题,用python2.7从mysql中取到的数据是元祖类型的,元祖内部的元素也是一个元祖(并且部分元素的编码格式是unicode的): 类似这样: ((10144, u''), ...
随机推荐
- Android仿掌上英雄联盟首页,实现折叠效果
概述 仿掌上英雄联盟首页的demo 详细 代码下载:http://www.demodashi.com/demo/10695.html 首页大概分为几个部分 状态栏 标题栏 轮播图 切换的Tab 资讯列 ...
- Javascript中的数据类型知多少
JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定.这也意味着你可以使用同一个变量保存不同类型的数据 根据ECMAScript 5. ...
- PHP中一些有用的函数
<?php /** * 加密解密 * * @param string $key * @param string $string * @param string $decrypt * @retur ...
- kubectl命令使用
语法: kubectl [command] [TYPE] [NAME] [flags] 1 command:子命令,用于操作Kubernetes集群资源对象的命令,如create, de ...
- Log4Net的概念和使用
第一篇文本日志 log4net简介: log4net简介: log4net是一个功能著名的开源日志记录组件,由java平台而来. 利用log4net可以方便地将日志信息记录到文件.控制台.Window ...
- Maven 向私服nexus上传jar
1. 单个jar上上传 方法一:利用界面(省略) 方法二:利用命令行: 1). 安装到本地库:mvn install:install-file -DgroupId=org.apache.hadoop ...
- 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】
[推荐系统之 BPR 算法] 1.关于BPR的论文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2.参考1:论文快读 - ...
- Spring MVC+Mybatis 执行存储过程,使用Map进行参数的传递
研究了一天mybatis如何执行存储过程,基本了解了ORM的设计思想,在map层面进行对象关系映射有两种思路. 根据不同的业务使用不同的思路: 一.实体类和数据库映射,就是将数据库中的字段和java实 ...
- JSP开发中对jstl的引用方式(标签库引用)
创建标签库引用文件taglibs.inc 一 采用本地标签库的taglibs.inc文件 <%--struts库标签 --%> <%@ taglib uri="/WEB-I ...
- Android Zip文件解压缩代码
2011-04-01 17:58:52| 分类: Android |举报 |字号 订阅 在Android平台中如何实现Zip文件的解压 缩功能呢? 因为Android内部已经集成了zlib库,对 ...