C# 通过反射得到Model实例

2020-02-06 更新
    /// <summary>
   /// 实体Model
   /// </summary>
   public class Data_Area
    {
        public int AreaId { get; set; }
        public string AreaCode { get; set; }
        public string AreaName { get; set; }
        public string CityCode { get; set; }
    }
/// <summary>
/// 数据库的任何一张表
/// </summary>
/// <typeparam name="T">表的Model</typeparam>
/// <param name="columnName">表的唯一主键名</param>
/// <param name="id">表的唯一主键的值</param>
/// <returns>返回Model实体</returns>
public T Find2<T>(string columnName, int id)
{
    //注意表名与实例名称是否一样
    Type type = typeof(T);
    string columnString = string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"));
    string sql = $"SELECT {columnString} FROM [{type.Name}] WHERE {columnName} = {id}";

    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        SqlCommand sqlCommand = new SqlCommand(sql, conn);
        conn.Open();
        SqlDataReader reader = sqlCommand.ExecuteReader();
        if (reader.Read())
        {
            T t = Activator.CreateInstance<T>();
            foreach (var prop in type.GetProperties())
            {
                //注意 这个要.net 4.5以上版本  才可以用
                if (!(reader[prop.Name] is DBNull))
                {
                    prop.SetValue(t, reader[prop.Name]);
                }
            }
            return t;
        }
        else
        {
            return default(T);
        }
    }
}
以下是获得实体Model的调用 注意Model要跟数据的字段对应
//Data_Area area = sqlServerHelper.Find2<Data_Area>("AreaId", 12);

C# 中使用反射的优缺点

优点:
            反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类;

  缺点:
           1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。      
          2、使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。   至于执行效率的话,还可以,因为它是一种强类型语言,执行效率不错。不过,建议将反射过后,保存进 cache中。

尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使用反射技术时,下面几条内容应该牢记于心:

首先是性能:

反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。

安全:
使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。

成员的内部暴露:

由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化