ToList和ToDataTable(其中也有反射的知识)

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication12
{
public class Student
{
public int? StuNo { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public override string ToString()
{
return this.StuNo + ":" + this.Name + ":" + this.Sex + ":" + this.Age;
}

}

public static class DataTableAndListExetension
{
public static List<T> ToList<T>(this DataTable table) where T:new()
{
List<T> list = new List<T>();
Type t = typeof(T);
PropertyInfo[] ps = t.GetProperties();
foreach (DataRow dr in table.Rows)
{
T obj = new T();
foreach (DataColumn col in table.Columns)
{

foreach (PropertyInfo p in ps)
{
if (p.Name == col.ColumnName)
{
if (!p.PropertyType.IsGenericType)
{
p.SetValue(obj,string.IsNullOrEmpty(dr[col.ColumnName].ToString())?null:Convert.ChangeType(dr[col.ColumnName],p.PropertyType));

}
else
{
Type genericTypeDefinition= p.PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
p.SetValue(obj,string.IsNullOrEmpty(dr[col.ColumnName].ToString())?null:Convert.ChangeType(dr[col.ColumnName],Nullable.GetUnderlyingType(p.PropertyType)));
}

}

}

}

}
list.Add(obj);
}
return list;
return null;

}
public static DataTable ToDataTable<T>(this List<T> list)
{
Type t = typeof(T);
PropertyInfo[] ps = t.GetProperties();
DataTable dt = new DataTable();
foreach (PropertyInfo p in ps)
{
Type type = p.PropertyType;
if (!p.PropertyType.IsGenericType)
{
dt.Columns.Add(p.Name, type);

}
else
{
Type genericTypeDefinition = p.PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
dt.Columns.Add(p.Name,Nullable.GetUnderlyingType(p.PropertyType));
}

}
foreach (T stu in list)
{

DataRow dr = dt.NewRow();
foreach (PropertyInfo p in ps)
{
dr[p.Name] = p.GetValue(stu);

}
dt.Rows.Add(dr);
}
return dt;
return null;
}

}
public class Program
{
public static List<Student> StuList = new List<Student>();
static void Main(string[] args)
{
StuList.Add(new Student() { StuNo=1, Name="1",Sex="1",Age=1});
StuList.Add(new Student() { StuNo = 2, Name = "2", Sex = "2", Age = 2 });
StuList.Add(new Student() { StuNo = 3, Name = "3", Sex = "3", Age = 3 });
StuList.Add(new Student() { StuNo = 4, Name = "4", Sex = "4", Age = 4 });
StuList.Add(new Student() { StuNo = 5, Name = "5", Sex = "5", Age = 5 });

DataTable dt = StuList.ToDataTable<Student>();
DataTable dt2 = dt.Clone();
List<Student> stus= dt.ToList<Student>();
Console.WriteLine(" dt.ToList<Student>()输出学生列表");
stus.ForEach(a => { Console.WriteLine(a.ToString()); });
Console.ReadLine();
foreach (DataRow odr in dt.Rows)
{
DataRow ndr = dt2.NewRow();
ndr.ItemArray = odr.ItemArray;
dt2.ImportRow(odr);
}
}
}
}

时间: 2024-11-05 02:24:39

ToList和ToDataTable(其中也有反射的知识)的相关文章

C#反射基础知识和实战应用

首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 . 总之,有了反射,以前很多实现不了的功能都可以实现. 下面先来写一个小例子,体验一下反射是怎么一回事: 打开VS2010,新建一个控制台应用程序,在program.cs里面写代码 首先引入命名空间: using System.Reflection; 下如下代码: PropertyInfo l

反射小知识 【方法篇】

reflect_method html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legen

java反射基础知识(一)

一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.对于反射的操作实际上就是通过Class对象获取: *a.java.lang.reflect.Field:提供有关类或接口的单个

java反射基础知识(二)

1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种"看透 class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运

java反射基础知识(四)反射应用实践

反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类. 通过getClass方法 在Java中,每一个Object都有一个getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类: 1 2 String s = "ziwenxie"; Class

java反射基础知识(五)反射应用实践

详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Class对象 构造器 变量 方法 私有变量与私有方法 注解 泛型 数组 本文也将从上面几个方面来介绍Java反射.本文涉及的所有代码均在反射代码首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnab

反射基本知识

介绍反射之前先介绍静态动态语言的概念 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化,通俗点说就是在运行时代码可以根据某些条件改变自身结构 主要动态语言:Object-C.C#.JavaScript.PHP.Python等 静态语言 与动态语言相对应的,运行结构不可变的语言就是静态语言,如Java.C.C++ Java不是动态语言,但Java可以称之为“准动态语言”.即Java有一定的动态性,我们可以利用反射机制获得

java反射准备知识

 object 类的所有方法 对象克隆 public Object clone()throws CloneNotSupportedException;   克隆对象所在的类一定要实现java.lang.Cloneable接口,子类只需要继续调用object   的克隆方法即可实现 对象输出 public String toString()    直接输出对象是默认调用 对象比较 public boolean equals(Object obj)    保存Set集合时,会依靠hashCode()

C#中反射的使用(How to use reflect in CSharp)(1)

最近想做一个插件式的软件给公司的监控用,初步的想法是使用C#去反射Dll,Invoke其中的方法.此文仅供开发参考,不涉及原理,98%的代码以及2%的废话. 测试Solution是这么建的(.NET FRAMEWORK 4.5.1): Person类代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 5 namespace PersonMoudle 6 { 7 public class Pe