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