知足常乐小三 2018-08-12 07:04 采纳率: 0%
浏览 6051
已结题

.net 如何在实体类动态添加属性

例如类
public class A
{
public string Name { get; set; }

    public string Sex { get; set; }
    }
两个属性,如何动态的添加
Age,Grade等其他的字段
  • 写回答

3条回答 默认 最新

  • hello_dengdai 2018-08-12 07:21
    关注

    第一种方法 使用Dynamic 支持.net4.0以上版本支持

    ```///
    /// 使用dynamic根据DataTable的列名自动添加属性并赋值
    ///
    ///
    ///
    public static Object GetDynamicClassBydt(DataTable dt)
    {
    dynamic d = new System.Dynamic.ExpandoObject();
    //创建属性,并赋值。
    foreach (DataColumn cl in dt.Columns)
    {
    (d as System.Collections.Generic.ICollection>).Add(newSystem.Collections.Generic.KeyValuePair(cl.ColumnName, dt.Rows[0][cl.ColumnName].ToString()));
    }
    return d;
    }

    第二种方法 使用反射(此方法比方法一的性能低,是通过动态生成类、并动态生成类的属性)
    
    
    

    ///
    /// 使用反射 动态创建类,将DataTable的列名动态添加为该类的属性,并给属性赋值
    /// 该方法由于要动态创建类,性能比较低(注意只是将DataTable的第一行转换为动态实体类)
    ///
    ///
    ///
    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;
    }

    
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题