对象数组转换为DataTable的方法

原创 2006年06月14日 17:51:00

在我们的项目中,用到了很多对象数组。需要把对象数组绑定到DataGrid上,但目前好像不能直接绑定。就只有转换为DataTable。好不容易在网上找到了别人写的一个类。但和我们的需要比还是差了一点。他只能把对象的属性转换为DataTable的列。但我们的对象数组都是WebServices自动生成的。也就是没有属性,只有Public的字段。所以我就在别人的基础上写了一个即可以转换属性又可以转换字段的类。不过必须要Public的哦。在加上我们的项目中经常在对象里还有对象,所以又支持了对象中包含对象的对象数组。具体代码如下:

欢迎各位网友改进,也希望大家改进后能贡献一下

 

using System;
using System.Data;
using System.Collections;
using System.Reflection;

namespace sms.Components
{
 /// <summary>
 /// ObjectArrayToDataTable 的摘要说明。
 /// </summary>
 public class ObjectArrayToDataTable
 {
  #region 构造函数
  public ObjectArrayToDataTable()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  #endregion

  #region 属性设置
  private bool _ColumnFromProperty = true;
  /// <summary>
  /// DataTable列是否根据对象的属性生成;默认为True,如果为False则由对象的字段生成
  /// </summary>
  public bool ColumnFromProperty
  {
   get{return _ColumnFromProperty;}
   set{_ColumnFromProperty=value;}
  }

  private string _PointString = ".";
  /// <summary>
  /// 点号的替换符号
  /// </summary>
  public string PointString
  {
   get{return _PointString;}
   set{_PointString = value;}
  }
  #endregion

  #region 公共方法

  /// <summary>
  /// 对象数组转换为DataTable
  /// </summary>
  /// <param name="objArry">对象数组</param>
  /// <returns></returns>
  public DataTable ArrayToDataTable(object[] objArry)
  {
   if(objArry.Length <= 0)
   {
    return null;
   }
   Type objType = objArry[0].GetType();
   DataTable dt = CreateDataTable(objType);
   dt = FillDataTable(dt, objArry);
   return dt;
  }

  #endregion

  #region 私有方法

  /// <summary>
  /// 创建DataTable
  /// </summary>
  /// <param name="objType"></param>
  /// <returns></returns>
  private DataTable CreateDataTable(Type objType)
  {
   DataTable dt = new DataTable();
   ArrayList[] myList;
   if(this.ColumnFromProperty)
   {
    myList = GetPropertiesInfo(objType, "");
   }
   else
   {
    myList = GetFieldsInfo(objType, "");
   }
   for(int i=0; i<myList[0].Count; i++)
   {
    DataColumn dColumn = new DataColumn(myList[0][i].ToString(), System.Type.GetType(myList[1][i].ToString()));
    dt.Columns.Add(dColumn);   
   }
   return dt;
  }


  private DataTable FillDataTable(DataTable dt, object[] objArry)
  {
   DataColumnCollection dtColumns = dt.Columns;
   Type objType = objArry[0].GetType();
   foreach (object obj in objArry)
   {
    DataRow dRow = dt.NewRow();
    for (int i = 0; i < dtColumns.Count; i++)
    {
     if(this.ColumnFromProperty)
     {
      dRow[i] = GetPropertyByPath(dtColumns[i].ColumnName, obj);
     }
     else
     {
      dRow[i] = GetFieldByPath(dtColumns[i].ColumnName, obj);
     }
    }
    dt.Rows.Add(dRow);
   }
   return dt;
  }


  /// <summary>
  /// 获取对象的字段信息
  /// </summary>
  /// <param name="myType">对象的类型</param>
  /// <param name="UpName">上级名称</param>
  /// <returns></returns>
  private ArrayList[] GetFieldsInfo(Type myType, string UpName)
  {
   ArrayList[] myList = new ArrayList[2];
   myList[0] = new ArrayList();
   myList[1] = new ArrayList();
   FieldInfo[] myFieldInfo = myType.GetFields();
   string strType = "";
   string strName = "";
   foreach (FieldInfo myField in myFieldInfo)
   {
    strName = (UpName == "")?myField.Name:UpName + this.PointString + myField.Name;
    strType = myField.FieldType.ToString();
    if(strType.Length > 2 && strType.Substring(strType.Length - 2, 2) != "[]")
    {
     if(strType.Length > 6 && strType.Substring(0, 6) == "System")
     {
      myList[0].Add(strName);
      myList[1].Add(myField.FieldType.ToString());
     }
     else
     {
      ArrayList[] aryOther = GetFieldsInfo(myField.FieldType, strName);
      for(int i=0; i<aryOther[0].Count; i++)
      {
       myList[0].Add(aryOther[0][i]);
       myList[1].Add(aryOther[1][i]);
      }
     }
    }
   }
   return myList;
  }


  /// <summary>
  /// 获取对象的属性信息
  /// </summary>
  /// <param name="myType">对象的类型</param>
  /// <param name="UpName">上级名称</param>
  /// <returns></returns>
  private ArrayList[] GetPropertiesInfo(Type myType, string UpName)
  {
   ArrayList[] myList = new ArrayList[2];
   myList[0] = new ArrayList();
   myList[1] = new ArrayList();
   PropertyInfo[] myPropertyInfo = myType.GetProperties();
   string strType = "";
   string strName = "";
   foreach (PropertyInfo myProperty in myPropertyInfo)
   {
    strName = (UpName == "")?myProperty.Name:UpName + this.PointString + myProperty.Name;
    strType = myProperty.PropertyType.ToString();
    if(strType.Length > 2 && strType.Substring(strType.Length - 2, 2) != "[]")
    {
     if(strType.Length > 6 && strType.Substring(0, 6) == "System")
     {
      myList[0].Add(strName);
      myList[1].Add(strType);
     }
     else
     {
      ArrayList[] aryOther = GetPropertiesInfo(myProperty.PropertyType, strName);
      for(int i=0; i<aryOther[0].Count; i++)
      {
       myList[0].Add(aryOther[0][i]);
       myList[1].Add(aryOther[1][i]);
      }
     }
    }
   }
   return myList;
  }


  private object GetFieldByPath(string strPath, object obj)
  {
   object objRet;
   string[] aryPaths;
   string strOtherPath = "";
   Type objType = obj.GetType();
   if(strPath.IndexOf(this.PointString) < 0)
   {
    objRet = objType.InvokeMember(strPath, BindingFlags.GetField, null, obj, null);
   }
   else
   {
    aryPaths = SplitPage(strPath, this.PointString);
    for(int i=1; i<aryPaths.Length; i++)
    {
     if(strOtherPath!=""){strOtherPath += this.PointString;}
     strOtherPath += aryPaths[i];
    }
    object objTemp = objType.InvokeMember(aryPaths[0], BindingFlags.GetField, null, obj, null);
    objRet = GetFieldByPath(strOtherPath, objTemp);
   }
   return objRet;   
  }


  private object GetPropertyByPath(string strPath, object obj)
  {
   object objRet;
   string[] aryPaths;
   string strOtherPath = "";
   Type objType = obj.GetType();
   if(strPath.IndexOf(this.PointString) < 0)
   {
    objRet = objType.InvokeMember(strPath, BindingFlags.GetProperty, null, obj, null);
   }
   else
   {
    aryPaths = SplitPage(strPath, this.PointString);
    for(int i=1; i<aryPaths.Length; i++)
    {
     if(strOtherPath!=""){strOtherPath += this.PointString;}
     strOtherPath += aryPaths[i];
    }
    object objTemp = objType.InvokeMember(aryPaths[0], BindingFlags.GetProperty, null, obj, null);
    objRet = GetFieldByPath(strOtherPath, objTemp);
   }
   return objRet;   
  }

 

  /// <summary>
  /// 根据指定的标记符,分隔字符串,并返回字符数组
  /// </summary>
  /// <param name="source">要分隔的字符串</param>
  /// <param name="split">分隔标记符字符串</param>
  public static string[] SplitPage(string source,string split)
  {  
   int len = split.Length;     
   ArrayList al = new ArrayList();
   int start = 0; //开始位置
   int j = -1; //匹配索引位置
   while(true)
   {
    j = source.IndexOf(split,start);
    if(j > -1)
    {
     al.Add(source.Substring(start,j-start));
     int s = j-start;   
     start = j+len;    
    }
    else
    {
     al.Add(source.Substring(start));
     break;
    }
   }
   string[] result;
   if(al.Count == 0)
   {
    string[] r = new string[1];
    r[0] = source;
    result = r;
   }
   else
   {
    string[] r = new string[al.Count];
    for(int i = 0; i < al.Count; i++)
    {
     r[i] = al[i].ToString();
    }
    result = r;
   }
   return result;
  }

  #endregion

 }
}

DataTable与数组相互转换

原文地址:http://hi.baidu.com/fxb_hyb/blog/item/ef80aba25e8e60a5cbefd0de.html using System; using S...
  • linshichen
  • linshichen
  • 2016年07月18日 14:57
  • 4622

如何把对象转换成数组

Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。文档可通过官网下载,也可点此链接下载https://pan.bai...
  • white_with_black
  • white_with_black
  • 2016年11月22日 21:18
  • 11532

将类数组对象转化成数组对象的几种方法

今天遇到一个问题,发现在操作类数组对象时特别不方便,于是就想到能否将类数组对象转化成数组对象,然后再利用数组对象强大又便捷的方法来操作呢?然后...然后在寻找解决方法的时候我就被自己蠢哭了...事情是...
  • mixue321
  • mixue321
  • 2016年04月14日 22:28
  • 6823

asp.net中DataTable和List<T>之间相互转换

在asp.net开发中常会遇到这样的问题,这里跟大家分享一个其之间相互转换的方法:using System; using System.Collections.Generic; using Syste...
  • taomanman
  • taomanman
  • 2015年07月03日 15:04
  • 3850

C#.net开发 List与DataTable相互转换

在.NET开发中,操作关系型数据库提取数据经常用到DataTable。ASP.NET前后台数据绑定应用DataTable的时候似乎也很多,但是List集合比DataTable应用更加广泛,提取处理数据...
  • shuizhaoshui
  • shuizhaoshui
  • 2016年05月16日 15:29
  • 9151

类数组转数组方法详解

类数组转数组:Array.prototype.slice.call(arguments)方法详解: 我们知道,Array.prototype.slice.call(arguments)能将具有leng...
  • u013084331
  • u013084331
  • 2016年04月21日 16:52
  • 1488

JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中

处理JSON字符串时,一直出错,写个例子后发现原来是没有弄清楚数据的格式问题。 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News packag...
  • u013147600
  • u013147600
  • 2015年08月10日 16:15
  • 5627

DataTable转List方法及转换时遇到可空类型问题

DataTable在一些后台操作上不是很便利,所以可以将数据集转换成List在进行操作。 简单直接的方法就是循环datatable一一对应赋值给类,然后附加到List中。但是遇到属性过多的时候就麻烦...
  • hebbers
  • hebbers
  • 2018年01月03日 09:39
  • 29

Java集合对象和数组对象的转换

在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。 1、数组对象转换为集合对象 ...
  • dyy_gusi
  • dyy_gusi
  • 2015年06月08日 16:39
  • 3223

对象 数组 字符串转

1,eval()   解析json对象 为字符串 也可将json字符串转为json对象 2,JSON.stringify()解析json对象或者数组 为字符串 3,JSON.par...
  • guorun18
  • guorun18
  • 2015年10月27日 18:01
  • 1351
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象数组转换为DataTable的方法
举报原因:
原因补充:

(最多只允许输入30个字)