上贴:由Sandy945用动态编译的方法实现了自动创建一个list所要添加的类,现在进一步进行变态要求
如以下代码        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Rows.Add(new object[] { 1, "Jerry" });
        dt.Rows.Add(new object[] { 2, "Ryu" });        
        List<object> list = Tools.JsonResult.GetList(dt);
        list[0].ID;  //如何实现这种写法呢?当然创建类的方式可以放在这外面,但前提是这个类是自动创建的Dtatable转List代码     public static 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;
        }问
1:list[0].ID; 如何实现这种写法呢?当然创建类的方式可以放在这外面,但前提是这个类是自动创建的
2:用这种自动编译代码会对程序性能有多大的影响谢谢

解决方案 »

  1.   


    public class Test{private int id;
    public int getId() {
    return id;
    }
    public void setId(int _id) {
    this.id= _id;
    }
    }
    List<Test> list = (Test)Tools.JsonResult.GetList(dt);
      

  2.   

    Object o= List[0];
    通过反射获取属性值
    Type t = typeof(o); 
                System.Reflection.PropertyInfo[] properties = t.GetProperties(); 
                foreach (System.Reflection.PropertyInfo property in properties) 
                { 
                    
                } public IList<T> GetList<T>(DataTable table)
            {            IList<T> list = new List<T>();
                T t = default(T);
                PropertyInfo[] propertypes = null;
                string tempName = string.Empty;            foreach (DataRow row in table.Rows)
                {
                    t = Activator.CreateInstance<T>();                propertypes = t.GetType().GetProperties();                foreach (PropertyInfo pro in propertypes)
                    {
                        tempName = pro.Name;
                        if (table.Columns.Contains(tempName))
                        {
                            object value = row[tempName];
                            pro.SetValue(t, value, null);                    }                }
                    list.Add(t);
                }
                return list;
            }