C#類兩種動態添加屬性並賦值的解決方法


搜索網上資料並根據項目中的需要最終整理出來分享給大家,希望對大家有所幫助

功能:將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;
}
View Code

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;
}
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM