光看标题的确不好说明问题,下面描述一下问题场景:


已知后端自定义的返回的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列表数据的更多相关文章

  1. [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据

    目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...

  2. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  3. ASP.NET MVC3快速入门——第五节、从控制器访问模型中的数据

    5.1 从控制器访问模型中的数据在本节中,我们将创建一个新的MoviesController类,并且书写代码来获取数据库中的数据,并通过视图模板来显示在浏览器中.鼠标右击Controller文件夹,点 ...

  4. Spring.NET 中的 ADO.NET 数据访问的示例

    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...

  5. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...

  6. SharePoint服务器端对象模型 之 访问网站和列表数据(Part 1)

    本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据.几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基 ...

  7. SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)

    (五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打 ...

  8. 【转】在Spring中基于JDBC进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...

  9. 从mysql中拿到的数据构造为列表

    最近测试接口遇到一个问题,用python2.7从mysql中取到的数据是元祖类型的,元祖内部的元素也是一个元祖(并且部分元素的编码格式是unicode的): 类似这样: ((10144, u''), ...

随机推荐

  1. linux显示桌面快捷键设置

    2013-01-06 10:31:52    Ubuntu显示桌面Indicator  IN: LINUX :-) HOT: 1,246 ℃  18十2011   www.2cto.com   大家一 ...

  2. HDUOJ---汉洛塔IX

    汉诺塔IX Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. Windows系统开机硬盘自检问题解决

    http://blog.sina.com.cn/s/blog_49063a0b0100tf7y.html硬盘开机自检通常都是由于计算机使用者的不合理使用电脑造成的,比如非常正关机,或者遭到病毒侵袭,抑 ...

  4. 运行shell出错: 没有那个文件或目录

    http://blog.163.com/zhangjie_0303/blog/static/99082706201136114548840/

  5. 那些恶心人的Screen基本概念

    Screen的这些基本概念中,最重要的就是dip的理解,而理解dip就是理解android适配不同设备的关键. Screen Size 实际物理尺寸.就是我们常说的3.5英寸屏幕,4.7英寸屏幕等等, ...

  6. js LINQ教程

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  7. JMeter学习笔记--JMeter执行顺序规则

    JMeter执行顺序规则: 配置元件 前置处理器 定时器 采样器 后置处理器(除非服务器响应为空) 断言 监听器 只有当作用域内存在采样器时,定时器.断言.前置/后置处理器才会被执行,逻辑控制器和采样 ...

  8. Linux内核“问题门” - 学习问题、经验集锦

    陈宪章说:“学贵有疑,小疑则小进,大疑则大进.疑者,觉悟之机也,一番觉悟一番长进.” 培根说:“多问的人将多得.” 还在学校的时候导师在激情讲演之后对着会议室里形态各异但均静默不语的我们痛心疾首的说: ...

  9. sublime text怎样安装ctags来定位函数

    sublime确实是一款非常不错的开发软件.用起来非常爽,里面集成了非常多插件.仅仅要安装就可以, 下来来介绍下sublime中ctags插件的安装,安装这个插件之后就能够高速定位某函数了,很方便. ...

  10. PSAPI和ToolHelpAPI学习笔记

    标 题: PSAPI学习笔记 作 者:北极星2003 时 间:2005-07-24 18:36 链 接:http://bbs.pediy.com/showthread.php?threadid=154 ...