为什么要写这个?因为发现,很多人在读取泛型集合中Item的值时,使用的方法是 item.GetType().GetField("xxxxx").GetValue() 或类似的写法。看到这种写法,我就知道,那个Coder一定不是很熟悉对象的内存分配,所以纠正一下写法。顺便说下这样写的依据。

首先是对象在内存的存放方式。也就是C#(或者其它语言)数据类型分为基础数据类型与引用数据类型的原因。

基础数据类型在内存中是值型的。用教我编程入门的老师的比方就是: 对象就像一幢楼。基础数据(值)类型就是一个个的房间(假设房间是最小单位)。引用数据类型就房间号索引;在内存中的表现为地址偏移量。那么,要去哪个房间,只需要检索房间号就可以了。

所以,当你取道了T的指定field时,就知道了field相对于T的基址的偏移量。那么,实例的基址(内存地址) + 偏移量,就可以得到你想要的值。

public static class Helper
{
public static string To<T>(this IEnumerable<T> source, string field, Type type)
{
var t = typeof (T);
var result = "";
if (type == typeof(PropertyInfo))
{
var p = t.GetProperty(field);
if (p != null)
{
foreach (var item in source)
{
result += p.GetValue(item,null) + ",";
}
}
}
else if (type == typeof(FieldInfo))
{
var f = t.GetField(field);
if (f != null)
{
foreach (var item in source)
{
result += f.GetValue(item) + ",";
}
}
}
return result;
}
}

用例:

    public class Ax
{
public string Value;
private string Name;
public int Age { get; set; }
}
            var list = new List<Ax>
{
new Ax {Age = , Value = "goldli"},
new Ax {Age = , Value = "金利"}
}; var x = list.To("Age",typeof(PropertyInfo));
Debug.WriteLine(x);

[原 -> 砖] C# IEnumerable<T>泛型取值的更多相关文章

  1. C语言数据类型取值范围

    一.获取数据类型在系统中的位数 在不同的系统中,数据类型的字节数(bytes)不同,位数(bits)也有所不同,那么对应的取值范围也就有了很大的不同,那我们怎么知道你当前的系统中C语言的某个数据类型的 ...

  2. 关于readdir返回值中struct dirent.d_type的取值有关问题(转)

    关于readdir返回值中struct dirent.d_type的取值问题 原网页链接 http://www.gnu.org/software/libc/manual/html_node/Direc ...

  3. C语言中数据类型取值范围的计算的理解与总结

    c语言中,数据类型有short,int,long,char,float,double,然后除了浮点型只有 有符号数(signed)外,其他的数据类型都分为有符号(signed)和无符号(unsigne ...

  4. Data层相关问题 & JS循环取值

    第一次写博客,里面是自己工作中碰到的问题及总结的知识点,便于自己以后回顾,技术大牛们请直接忽略这篇文章,也希望能帮助到想我这样的小白! Data层相关问题总结: 1. 代码管理用的是 VSS 2005 ...

  5. 为什么数值类型byte取值范围是(-128~127)?

    在解决这个问题之前,我们先了解几个概念? 一.原码, 反码, 补码的概念 正数的反码和补码都与原码一样: 负数的反码.补码与原码不同,负数的反码:原码中除去符号位,其他的数值位取反,0变1,1变0.负 ...

  6. java中为什么byte的取值范围是-128到+127

    概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数.正数补码为其本身:负数补码为其绝对值各位取反加1:例如:+21,其二进制表示形式是000101 ...

  7. 学习笔记 - 深究Bitmap压缩避免OOM的核心inSampleSize的最佳取值

    /** * 测试代码,通过在SDCard根目录放置几种不同大小的图片, 来自动测试压缩方式是否有效同时看是否会内存不够. * * @since * By:AsionTang * At:2014年3月2 ...

  8. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  9. 带符号的char类型取值范围为什么是-128——127

    以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...

随机推荐

  1. <转>写给浮躁的IT同仁(请不要做浮躁的人)

    1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么.当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异. 2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用 ...

  2. 软件测试技术(六)——白盒测试之控制流覆盖准则+Visual Studio 2013单元测试

    一.目标程序 单片机发送的A/D转换结果的整体格式为:[DLE][STX]Message[CHKSUM][DLE][ETX],其中[]括号中的字符为16进制的助记符,并非ASCII码.其中:[DLE] ...

  3. C++小游戏:扑克牌21点

    21点扑克牌游戏: 程序说明:该程序是模拟21点扑克牌游戏,玩家最多可以要5张牌,但是如果牌的点数之和超过21点,则自动出局,在不超过21点的情况下,玩家与庄家比牌的大小,大者为赢家 程序片段分析: ...

  4. 通过gdb跟踪Linux内核装载和启动可执行程序过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的:通过对一个简单的可执 ...

  5. CTSC2014 被虐总结

    第一次参加全世界最难的比赛- - 感觉简直神 两试考了65+81=146分 Ag线155 Au线190+ orz 又是一粒Cu QAQ orz神ak170大虐全场 Day1: 考试经过: day1睡得 ...

  6. 设置结点的ID为固定ID

    https://www.java.net//forum/topic/jxta/jxta-community-forum/how-initialize-pse-jxse-27 ————————————— ...

  7. Hibernate之Session对象的相关方法以及持久化对象的状态

    一.持久化对象的状态        站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...

  8. labview 中activex的初步使用方法

    1.在前面板放置一个activex容器 2.插入activex控件 3.百度找到这个activex控件的属性和方法介绍 4.程序框图中右键activex控件,创建xxx类的方法或者xxx的属性:act ...

  9. 微软企业库5.0学习-Security.Cryptography模块

    一.微软企业库加密应用模块提供了两种加密: 1.Hash providers :离散加密,即数据加密后无法解密 2.Symmetric Cryptography Providers:密钥(对称)加密法 ...

  10. Umbraco 上传文件到另一个文件夹,而不是media files

    If you want to upload there media files to another place in the same instance of IIS, for example a ...