【代码保留】IList转DataTable

         #region  数据集互操作

        
///   <summary>
        
///  将集合类转换成DataTable
        
///   </summary>
        
///   <param name="list"> 集合 </param>
        
///   <returns></returns>
         public   static  DataTable ToDataTable(IList list)
        {
            DataTable result 
=   new  DataTable();
            
if  (list.Count  >   0 )
            {
                PropertyInfo[] propertys 
=  list[ 0 ].GetType().GetProperties();
                
foreach  (PropertyInfo pi  in  propertys)
                {
                    result.Columns.Add(pi.Name, pi.PropertyType);
                }

                
for  ( int  i  =   0 ; i  <  list.Count; i ++ )
                {
                    ArrayList tempList 
=   new  ArrayList();
                    
foreach  (PropertyInfo pi  in  propertys)
                    {
                        
object  obj  =  pi.GetValue(list[i],  null );
                        tempList.Add(obj);
                    }
                    
object [] array  =  tempList.ToArray();
                    result.LoadDataRow(array, 
true );
                }
            }
            
return  result;
        }

        
///   <summary>
        
///  将泛型集合类转换成DataTable
        
///   </summary>
        
///   <typeparam name="T"> 集合项类型 </typeparam>
        
///   <param name="list"> 集合 </param>
        
///   <returns> 数据集(表) </returns>
         public   static  DataTable ToDataTable < T > (IList < T >  list)
        {
            
return   ConvertX.ToDataTable < T > (list,  null );
        }

        
///   <summary>
        
///  将泛型集合类转换成DataTable
        
///   </summary>
        
///   <typeparam name="T"> 集合项类型 </typeparam>
        
///   <param name="list"> 集合 </param>
        
///   <param name="propertyName"> 需要返回的列的列名 </param>
        
///   <returns> 数据集(表) </returns>
         public   static  DataTable ToDataTable < T > (IList < T >  list,  params   string [] propertyName)
        {
            List
< string >  propertyNameList  =   new  List < string > ();
            
if  (propertyName  !=   null )
                propertyNameList.AddRange(propertyName);

            DataTable result 
=   new  DataTable();
            
if  (list.Count  >   0 )
            {
                PropertyInfo[] propertys 
=  list[ 0 ].GetType().GetProperties();
                
foreach  (PropertyInfo pi  in  propertys)
                {
                    
if  (propertyNameList.Count  ==   0 )
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
                    
else  
                    {
                        
if  (propertyNameList.Contains(pi.Name))
                            result.Columns.Add(pi.Name, pi.PropertyType);
                    }
                }

                
for  ( int  i  =   0 ; i  <  list.Count; i ++ )
                {
                    ArrayList tempList 
=   new  ArrayList();
                    
foreach  (PropertyInfo pi  in  propertys)
                    {
                        
if  (propertyNameList.Count  ==   0 )
                        {
                            
object  obj  =  pi.GetValue(list[i],  null );
                            tempList.Add(obj);
                        }
                        
else
                        {
                            
if  (propertyNameList.Contains(pi.Name))
                            {
                                
object  obj  =  pi.GetValue(list[i],  null );
                                tempList.Add(obj);
                            }
                        }
                    }
                    
object [] array  =  tempList.ToArray();
                    result.LoadDataRow(array, 
true );
                }
            }
            
return  result;
        }

        
#endregion
    }

    
public   class  ConvertXToDataTableTester : ITest
    {
        
#region  ITest 成员

        
public   string  Name
        {
            
get  {  return   new  ConvertXToDataTableTester().GetType().Name; }
        }

        
public   void  StartRuntime()
        {
            
// Test1(ToDataTable<>):boundary
            CollectionBase < Item >  items1  =   new  CollectionBase < Item > ();
            items1.Add(
new  Item( " item1_1 " 1 ));
            items1.Add(
new  Item( " item1_2 " " null " ));
            items1.Add(
new  Item( " item1_3 " 3 ));

            DataTable dt 
=  ConvertX.ToDataTable < Item > (items1);

            
foreach  (DataRow dr  in  dt.Rows)
            {
                Console.WriteLine(
" {0},{1} " , dr[ " text " ].ToString(), dr[ 1 ].ToString());
            }

            
// Test2(ToDataTable):
            ArrayList items2  =   new  ArrayList();
            items2.Add(
new  Item( " item2_1 " 3 ));
            items2.Add(
new  Item( " item2_2 " 4 ));
            items2.Add(
new  Item( " item2_3 " 5 ));

            DataTable dt2 
=  ConvertX.ToDataTable(items2);

            
foreach  (DataRow dr  in  dt2.Rows)
            {
                Console.WriteLine(
" {0},{1} " , dr[ " text " ].ToString(), dr[ 1 ].ToString());
            }

            
// Test3(ToDataTable<>):
            IList < Item >  items3  =   new  CollectionBase < Item > ();
            items3.Add(
new  Item( " item3_1 " 3 ));
            items3.Add(
new  Item( " item3_2 " 4 ));
            items3.Add(
new  Item( " item3_3 " 5 ));

            DataTable dt3 
=  ConvertX.ToDataTable < Item > (items3,  " Text " );

            
foreach  (DataRow dr  in  dt3.Rows)
            {
                
// Console.WriteLine("{0},{1}", dr["text"].ToString(), dr[1].ToString());
                Console.WriteLine( " {0} " , dr[ " text " ].ToString());
            }

            
// Test4(ToDataTable<>):Error with error column name
             try
            {
                
foreach  (DataRow dr  in  dt.Rows)
                {
                    Console.WriteLine(dr[
" errorName " ].ToString());
                }
            }
            
catch  (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        
#endregion
    }

    
public   class  Item
    {
        
public  Item( string  text,  object  value)
        {
            
this .text  =  text;
            
this .value  =  value;
        }
        
private   string  text;
        
public   string  Text
        {
            
get
            {
                
return   this .text;
            }
            
set
            {
                
this .text  =  value;
            }
        }

        
private   object  value;
        
public   object  Value
        {
            
get
            {
                
return   this .value;
            }
            
set
            {
                
this .value  =  value;
            }
        }
    }

     public   interface  ITest
    
{
        
string Name get; }
        
void StartRuntime();
    }

using  System;
using  System.Collections.Generic;
using  System.Text;
using  yd.Base;
using  yd.Base.Collections.Generic;
using  yd.Util;

namespace  ConsoleApplicationTester
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
bool debugging = false;

            CollectionBase
<ITest> testers = new CollectionBase<ITest>();
            
//testers.Add(new QuarterTester());
            
//testers.Add(new ConvertXToDataTableTester());

            
foreach (ITest tester in testers)
            
{
                
if (debugging == false)
                
{
                    
try
                    
{
                        tester.StartRuntime();
                        Console.WriteLine(
"___________________________________");
                        Console.WriteLine(tester.Name 
+ " succeed!");
                    }

                    
catch (Exception ex)
                    
{
                        Console.WriteLine(tester.Name 
+ " with errors!");
                        Console.WriteLine(
"____________The error is under the line!__________");
                        Console.WriteLine(ex.Message);
                        Console.WriteLine(
"!!!!!!!!!!!!!!!!!!!!@@@@@@@!!!!!!!!!!!!!!!!!!!!");
                    }

                }

                
else
                
{
                    tester.StartRuntime();
                    Console.WriteLine(
"___________________________________");
                    Console.WriteLine(tester.Name 
+ " succeed!");
                }

            }

        }

    }

}


CollectionBase<T>: 泛型集合类型,赋予集合业务意义,增强集合的抽象使用

你可能感兴趣的:(Datatable)