搜索網上資料並根據項目中的需要最終整理出來分享給大家,希望對大家有所幫助
功能:將DataTable 中的colums名稱作為屬性動態添加到類中,將DataTable中的第一行數據給屬性賦值
1.第一種方法 使用Dynamic 支持.net4.0以上版本支持

/// <summary> /// 使用dynamic根據DataTable的列名自動添加屬性並賦值 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static Object GetDynamicClassBydt(DataTable dt) { dynamic d = new System.Dynamic.ExpandoObject(); //創建屬性,並賦值。 foreach (DataColumn cl in dt.Columns) { (d as System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string, object>>).Add(newSystem.Collections.Generic.KeyValuePair<string, object>(cl.ColumnName, dt.Rows[0][cl.ColumnName].ToString())); } return d; }
2.第二種方法 使用反射(此方法比方法一的性能低,是通過動態生成類、並動態生成類的屬性)

/// <summary> /// 使用反射 動態創建類,將DataTable的列名動態添加為該類的屬性,並給屬性賦值 /// 該方法由於要動態創建類,性能比較低(注意只是將DataTable的第一行轉換為動態實體類) /// </summary> /// <param name="dt"></param> /// <returns></returns> public static Object CreatNewClassBydt(DataTable dt) { if (dt == null || dt.Rows.Count < 1) { return null; } //創建編譯器實例。 CSharpCodeProvider provider = new CSharpCodeProvider(); //設置編譯參數。 CompilerParameters paras = new CompilerParameters(); paras.GenerateExecutable = false; paras.GenerateInMemory = true; //創建動態代碼。 StringBuilder classSource = new StringBuilder(); classSource.Append("public class DynamicClass \n"); classSource.Append("{\n"); //創建屬性。 foreach (DataColumn cl in dt.Columns) { classSource.Append(propertyString(cl.ColumnName)); } classSource.Append("}"); System.Diagnostics.Debug.WriteLine(classSource.ToString()); //編譯代碼。 CompilerResults result = provider.CompileAssemblyFromSource(paras, classSource.ToString()); //獲取編譯后的程序集。 Assembly assembly = result.CompiledAssembly; object obclass = assembly.CreateInstance("DynamicClass"); foreach (DataColumn cl in dt.Columns) { ReflectionSetProperty(obclass, cl.ColumnName, dt.Rows[0][cl.ColumnName].ToString()); PropertyInfo _Property = obclass.GetType().GetProperty(cl.ColumnName); if (_Property != null && _Property.CanRead) { _Property.SetValue(obclass, dt.Rows[0][cl.ColumnName].ToString(), null); } } return obclass; }