如,我有一个方法
List<object> GetList(DataTable dt);他实现的功能为,比如现在传入table
    //现在有数据
    //ID   Name   Sex
    //1    Jerry  男
    //2    Ruy    男
    //3    Ken    女
那么他返回
    List<object> list = new List<object>();
    list.Add(new { ID = 1, Name = "Jerry", Sex = "男" });
    list.Add(new { ID = 2, Name = "Ruy", Sex = "男" });
    list.Add(new { ID = 3, Name = "Ken", Sex = "女" });比如再传入Table
ID Class Name 
A  一    龙 
B  二    春丽 
C  三    豪鬼 
那么他返回
new {ID = "A", Class = "一", Name = "龙"} 
new {ID = "B", Class = "二", Name = "春丽"} 
new {ID = "C", Class = "三", Name = "豪鬼"} 
-------------------------------------------------------
也就是动态的根据一个Table转换成一个list<object>对像,格式就像我上面的
谢谢

解决方案 »

  1.   

    这个字段个数不能确定的情况下只能通过反射来做了。动态取model属性数量。
      

  2.   

    反射这些我都会,
    我现在不会的是,如何来创建这么一个
    new {ID = "A", Class = "一", Name = "龙"}
    对像
    谢谢
      

  3.   

    - =!
    不懂,
    等待学习...创建一个这样的对象..
    不能用类么?? 3个属性 在getset封装
      

  4.   

    一定要用模型类啊,方法返回类型用ILIST吧,具体就返回泛型的list,如list<model>
      

  5.   

    获取传入的datatable的行列数循环读取添加不行么?
      

  6.   

    RE:
    - =! 
    不懂, 
    等待学习... 创建一个这样的对象.. 
    不能用类么?? 3个属性 在getset封装
    ---------------------------------

    那如果是这样的话,那我不是得预知我会传入哪些table了,问题是我不能确定我传入的table的结构
      

  7.   

    RE:
    获取传入的datatable的行列数循环读取添加不行么?
    ---------------------------------

    这里的难点不在数据赋值
    而是如何来创建这个对像

    谢谢
      

  8.   

    只要能确定一定是3条属性的话.直接用 3条string属性 不就可以啦?管他什么类型,都转换成string去显示不就可以了
      

  9.   

    用反射获取他的列名
    可以试试,然后根据获取的列名,在动态创建object的对象
      

  10.   

    想到一个可能很费性能的方法,就是对每一行datatable都new一个list,在这个list中add进属性,有需要的话把属性的数据类型也放进去,然后把这个listadd在整个的大list之中
      

  11.   

    小弟愚昧,实在想不太明白,把DataTable放在object对象里的用途是什么,为了存放么?
    写了点代码,供大家批评指点。
    public List<Dictionary<string, string>> GetList(DataTable table)
        {
            List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
            Dictionary<string, string> dic = dic = new Dictionary<string, string>();
            
            for (int i = 0; i < table.Rows.Count; i++)
            {           
                for (int j = 0; j < table.Columns.Count; j++)
                {                
                    dic.Add(table.Columns[j].ColumnName, table.Rows[i][j].ToString());
                    
                }
                list.Add(dic);
                dic = new Dictionary<string, string>();            
            }
            return list;
        }我没放在object里,放在了Dictionary<string, string>,方便索引,减少装箱拆箱。
    使用的时候GetList(table)[行号][列名]
      

  12.   

    RE:楼上
    Dictionary 只是用来做字典,只有key value 对我多个字段就不行了RE:小弟愚昧,实在想不太明白,把DataTable放在object对象里的用途是什么,为了存放么
    -------
    我也不知道有什么用,突然间想到来转的,但是却想不出怎么来转就放上来了谢谢
      

  13.   

    Dictionary 只是用来做字典,只有key value 对我多个字段就不行了  ?????list[0]["ID"]
    "1"
    list[0]["Sex"]
    "男"
    list[0]["Name"]
    "Jerry"这个不就可以对你多个字段么?楼主再讲讲,我真的糊涂
      

  14.   


    private DataTable GetDT()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
                dt.Columns.Add(new DataColumn("Name", typeof(String)));
                dt.Columns.Add(new DataColumn("Sex", typeof(String)));
                DataRow dr = dt.NewRow();
                dr[0] = 1;
                dr[1] = "A";
                dr[2] = "男";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 2;
                dr[1] = "B";
                dr[2] = "男";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 3;
                dr[1] = "C";
                dr[2] = "女";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 4;
                dr[1] = "D";
                dr[2] = "女";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 5;
                dr[1] = "E";
                dr[2] = "男";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 6;
                dr[1] = "F";
                dr[2] = "女";
                dt.Rows.Add(dr);
                return dt;
            }
            private DataTable GetDT1()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
                dt.Columns.Add(new DataColumn("Class", typeof(String)));
                dt.Columns.Add(new DataColumn("Sex", typeof(String)));
                DataRow dr = dt.NewRow();
                dr[0] = 1;
                dr[1] = "A";
                dr[2] = "男";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 2;
                dr[1] = "B";
                dr[2] = "男";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr[0] = 3;
                dr[1] = "C";
                dr[2] = "女";
                dt.Rows.Add(dr);
                
                return dt;
            }
    private List<object> GetList(DataTable dt)
            {
                List<object> l = new List<object>();            StringBuilder sb = new StringBuilder();
                sb.Append("using System;");
                sb.Append(Environment.NewLine);
                sb.Append("public class ClassName");
                sb.Append(Environment.NewLine);
                sb.Append("{");
                sb.Append(Environment.NewLine);
                for (int i = 0; i < dt.Columns.Count; i++)
                {                
                    sb.AppendFormat("public {0} {1} ", dt.Columns[i].DataType.Name, dt.Columns[i].ColumnName);
                    sb.Append("  { set; get; } ");
                    sb.Append(Environment.NewLine);
                }
                sb.Append("}");            // 1.CSharpCodePrivoder
                Dictionary<string, string> providerOptions = new Dictionary<string, string>();
                providerOptions.Add("CompilerVersion", "v3.5");
                CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(providerOptions);            // 2.ICodeComplier
                ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();            // 3.CompilerParameters
                CompilerParameters objCompilerParameters = new CompilerParameters();
                objCompilerParameters.ReferencedAssemblies.Add("System.dll");
                objCompilerParameters.GenerateExecutable = false ;
                objCompilerParameters.GenerateInMemory = true;            // 4.CompilerResults
                CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, sb.ToString());            if (cr.Errors.HasErrors)
                {
                   return null;
                }
                Assembly objAssembly = cr.CompiledAssembly;
                object ClassName;
                Type type;
                PropertyInfo[] pi;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    ClassName = objAssembly.CreateInstance("ClassName");                
                    type = ClassName.GetType();                
                    pi = type.GetProperties();
                    for (int j = 0; j < pi.Length; j++)
                    {
                        pi[j].SetValue(ClassName, dt.Rows[i][j], null);
                    }
                    l.Add(ClassName);
                }            return l;
            }调用new Program().GetList(new Program().GetDT());
    new Program().GetList(new Program().GetDT1());