C#[C#] 反射

反射

简介

  反射是
.NET中的主要体制,通过反射,可以在运维时得到程序或程序集中类型(包蕴class、struct、delegate、interface 和 enum 等)的积极分子和分子的新闻。

  通过反射,即可对各个档次了如指掌,并且也足以通过反射创设、调用和访问对象,即使在编译时不分明该对象的花色。 

C#,  程序集带有模块,模块包涵类型,而项目涵盖成员。反射提供包装程序集、模块和类其他对象。可以接纳反射动态地创制项目标实例,将项目绑定到现有对象,或从现有对象中获取项目。

 

优缺点

  优点:

  1. 做实了先后的八面后珑和扩张性;
  2. 下降耦合性;
  3. 它同意程序创造和控制其余类的靶子,无需提前硬编码目的类。

  缺点:

  1. 质量:使用反射基本上是一种解释操作,从理论上讲使用反射远慢于直接代码;
  2. 可读性下落。

 

反射的品类成员新闻

  • Assembly:定义和加载程序集。

  • Module:模块新闻(如带有模块的程序集和模块中的类)。 

  • ConstructorInfo:构造函数新闻(如名称、参数、访问修饰符等)。
  • MethodInfo:方法成员音信(如名称、重回类型、参数和走访修饰符等)。

  • FieldInfo:字段成员消息(如名称、访问修饰符)。

  • 伊夫ntInfo:事件成员消息(如名称、事件处理程序的数据类型、自定义本性、申明类型以及事件的反光的档次)。

  • PropertyInfo:属性成员音信(如名称、数据类型、注解类型,反射的品种和品质的只读或可写状态),并拿走或设置属性值。

  • ParameterInfo:参数成员音讯(如参数名、数据类型以及参数在方式签名中的地方等)。

  • CustomAttributeData:自定义本性音讯。

 

  System.Reflection.Emit 命名空间的类提供一种专用情势的反光,使你可以在运作时生成类型。

 

反射的粗略用法

  命名空间:System.Reflection、System.Type、System.Reflection.Assembly

  常见的收获 Type
对象的用法:

            Type type1 = typeof(string);
            string msg = "";
            Type type2 = msg.GetType();

 

 

 三个宽广的示范用法

  我们一先导学习三层架构的时候,都应有会融洽随后导师出手制作三个SqlHelper
的啊,那里小编截取贰个通过反射读取数据库数据并填充到三个目的的习性上,通过轮回遍历,最终生成一个list 列表的代码。

        /// <summary>
        /// 执行 Reader 并读取数据转换成集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <param name="commandType"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static IList<T> ExecuteReaderToList<T>(string sql, CommandType commandType = CommandType.Text,
            params SqlParameter[] parameters) where T : new()
        {
            var type = typeof(T);
            var props = type.GetProperties();
            var list = new List<T>();

            using (var reader = ExecuteDataReader(sql, commandType, parameters))
            {
                while (reader.Read())
                {
                    var entity = new T();

                    foreach (var propertyInfo in props)
                    {
                        var schemaTable = reader.GetSchemaTable();
                        if (schemaTable == null)
                            return new List<T>();

                        schemaTable.DefaultView.RowFilter = $"ColumnName='{propertyInfo.Name}'";
                        if (schemaTable.DefaultView.Count <= 0) continue;

                        if (!propertyInfo.CanWrite)
                            continue;

                        var val = reader[propertyInfo.Name];

                        if (val != DBNull.Value)
                            propertyInfo.SetValue(entity, val);
                    }

                    list.Add(entity);
                }
            }

            return list;
        }

  简单分析应用反射的代码:

    (1)type.GetProperties():获取属性集合;

    (2)propertyInfo.CanWrite:可写属性;

    (3)propertyInfo.SetValue(entity,
val):属性赋值,选用相应的对象进行赋值。

 

 


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6242357.html 

【参考】微软官方文档

 

相关文章