上贴:由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:用这种自动编译代码会对程序性能有多大的影响谢谢
如以下代码 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:用这种自动编译代码会对程序性能有多大的影响谢谢
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);
通过反射获取属性值
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;
}