关于反射

文章参考来源:https://www.cnblogs.com/wangshenhe/p/3256657.html
       https://www.cnblogs.com/Stephenchao/p/4481995.html
感谢:SamWang , Stephen_潮

认知尚浅,如有错误,愿闻其详!

对反射的理解

首先,我们要晓得,.Net应用程序由程序集(Assembly)、模块(Module)、类型(class)组成,反射,则是一种编程方式,动态的去获取装配件(编译出的.dll或.exe文件)信息和创建对象、调用方法。

  • 1、通过反射这种方式去了解类或者是程序集内部结构及功能,获得程序集或程序集中的每个类型(包括类、构造函数、委托、接口、方法和属性等),然后利用获取到的信息进行创建对象等操作。
  • 2、程序运行时动态创建对象并执行其中的方法。

为什么要用反射?

反射,整个过程大概就是在程序运行状态下,动态的去获取某个程序集的信息,然后利用信息创建对象,调用方法,实现功能。
问题是我们明明是可以在开发时将代码写好,为什么还要动态创建,繁琐且效率受影响?
其实,donNet的类库实现基本是使用反射实现的调用,他的效率及影响取决于你是否能合适的去使用。凡事有两面性,合适应用可提高程序的复用性和 灵活性,否则适得其反。

举个例子:
在一个媒体播放的软件中,我们希望其他人可以编写一些插件来扩充这个软件的功能,这时,我们在开发的时候,就需要在该软件中留下对应的接口,如下。

    public interface IMediaFormat
    {
        string Extension { get; }//拓展名
        Decoder GetDecoder();//解码对象
    }

上例中的接口包含Extnsion属性,这个属性返回支持解码的拓展名,方法是返回一个解码对象(默认存在Decoder类,该类提供对文件的解码,插件实现接口即可),通过解码对象处理后,我们就可以获得解释的文件流。
然后,我们开发就规定所有的解码插件都必须要派生一个解码器,并且实现这个接口,在GetDecoder方法中返回解码器对象,并且将其类型的名称配置到我们的配置文件里。
最后,我们就不需要在开发播放器时就完整的把所有类型的媒体格式都放进去,只需要从配置文件中获取解码器类型名称,而动态的创建媒体格式对象,将其转换成IMediaFormat接口来使用,即可实现功能。

如何用反射?

反射用到的主要类:
System.Type 类--通过这个类可以访问任何给定数据类型的信息。
System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

代码

创造一个具有字段、无参构造函数、有参构造函数、获取字段的方法以及Value属性的程序集

 public class TestReflection
    {
        private string _value;
        /// <summary>
        /// 无参构造函数
        /// </summary>
        public TestReflection()
        {
        }
        /// <summary>
        /// 有参构造函数
        /// </summary>
        /// <param name="value">传入参数</param>
        public TestReflection(string value)
        {
            _value = value;
        }
        /// <summary>
        /// 处理方法
        /// </summary>
        /// <param name="prefix">传入值</param>
        /// <returns>处理结果</returns>
        public string GetValue(string prefix)
        {
            if (_value == null)
                return "NULL";
            else
                return prefix + "  :  " + _value;
        }
        /// <summary>
        /// 属性
        /// </summary>
        public string Value
        {
            set
            {
                _value = value;
            }
            get
            {
                if (_value == null)
                    return "NULL";
                else
                    return _value;
            }
        }
    }

实现对以上这个程序集的反射处理。

//获取类型信息
            Type t_1 = Type.GetType("ReflectionDemo.TestReflection");
            Console.WriteLine(t_1);
            //构造器的参数
            object[] constuctParms = new object[] { "构造函数传入参数" };
            //根据类型创建对象
            object dObj = Activator.CreateInstance(t_1, constuctParms);
            //获取方法的信息
            MethodInfo method = t_1.GetMethod("GetValue");
            //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
            BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
            //GetValue方法的参数
            object[] parameters = new object[] { "Hello" };
            //调用方法,用一个object接收返回值
            object returnValue = method.Invoke(dObj, flag, Type.DefaultBinder, parameters, null);
            Console.WriteLine(returnValue.ToString());
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • Golang的反射reflect深入理解和示例 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够...
    陈卧虫阅读 414评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,100评论 1 32
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,967评论 6 13
  • 大家好,我是IT修真院深圳分院的学员,一枚正直纯洁善良的JAVA程序员。本次为大家带来关于反射的入门。 1.背景介...
    预言之上阅读 485评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,311评论 0 9