什么是反射?

答: 反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件.

通过对类型动态实例化后,还可以对其执行操作。 简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个.net framework内建的万能工厂。

一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)

示例:

using System;
using System.Collections.Generic;
using System.Text;

namespace Example25Lib
{
    public class Class1
    {
        private string name;
        private int age;

//如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
        //在此特意不实现,以便在客户调用端体现构造函数的反射实现
        //public Class1()
        //{
        //}
        public Class1(string Name, int Age)
        {
            name = Name;
            age = Age;
        }
        public void ChangeName(string NewName)
        {
            name = NewName;
        }
        public void ChangeAge(int NewAge)
        {
            age = NewAge;
        }
        public override string ToString()
        {
            return string.Format("Name: {0}, Age: {1}", name, age);
        }
    }
}

反射实例化对象并调用其方法,属性和事件的反射调用略

using System;
using System.Collections.Generic;
using System.Text;
//注意添加该反射的命名空间
using System.Reflection;

namespace Example25
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载程序集
            Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");

//遍历程序集内所有的类型,并实例化
            Type[] tmpTypes = tmpAss.GetTypes();
            foreach (Type tmpType in tmpTypes)
            {
                //获取第一个类型的构造函数信息
                ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
                foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
                {
                    //为构造函数生成调用的参数集合
                    ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();
                    object[] tmpParams = new object[tmpParamInfos.Length];
                    for (int i = 0; i < tmpParamInfos.Length; i++)
                    {
                        tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
                        if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                        {
                            tmpParams[i] = "Clark";
                        }
                    }

//实例化对象
                    object tmpObj = tmpConsInfo.Invoke(tmpParams);
                    Console.WriteLine(tmpObj);

//获取所有方法并执行
                    foreach (MethodInfo tmpMethod in tmpType.GetMethods())
                    {
                        //为方法的调用创建参数集合
                        tmpParamInfos = tmpMethod.GetParameters();
                        tmpParams = new object[tmpParamInfos.Length];
                        for (int i = 0; i < tmpParamInfos.Length; i++)
                        {
                            tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
                            if (tmpParamInfos[i].ParameterType.FullName == "System.String")
                            {
                                tmpParams[i] = "Clark Zheng";
                            }
                            if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")
                            {
                                tmpParams[i] = 27;
                            }
                        }
                        tmpMethod.Invoke(tmpObj, tmpParams);
                    }

//调用完方法后再次打印对象,比较结果
                    Console.WriteLine(tmpObj);
                }
            }

Console.ReadLine();
        }
    }
}

转载于:https://www.cnblogs.com/JaneTang/archive/2009/12/09/1620627.html

【转】C#基础概念之“什么是反射?”相关推荐

  1. WCF分布式开发步步为赢(1):WCF分布式框架基础概念

     众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都 ...

  2. 【基础概念大总结】— 网络安全 Java 基础知识大汇总

    这一篇,我们介绍一下:Java语言中存在有哪些安全漏洞. 我们在渗透测试中,可以如何利用这些漏洞. 那这一篇,首先全面总结一下JAVA中的基础概念. 上课了~~~上课了~~· 目录 JVM JDK J ...

  3. 第一章图像处理基础概念(人眼和光)

    系列文章目录 第一章 图像处理基础概念 第二章 常见算法处理 第三章 灰度变化 第四章 空间滤波 第五章 频域滤波 第六章 色彩基础 第七章 小波和多分辨率 第八章 图像表示和描述 第九章 形态学图像 ...

  4. JAVA面试-基础加强与巩固:反射、注解、泛型等

    https://www.jianshu.com/p/aaf8594e02eb 企业重视的是学习能力:基础很重要 JDK1.5新特性 泛型 foreach 自动拆箱装箱 枚举 静态导入(Static i ...

  5. 转: C#的25个基础概念

    转: C#的25个基础概念 1.静态变量和非静态变量的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.int ...

  6. 音视频基础概念(6)——视频基础

    网上冲浪时,我们会接触到网络流媒体和本地视频文件.常见的视频文件格式有MP4.MKV.AVI等.在流媒体网站上看见视频常用的协议有HTTP.RTSP.RTMP.HLS等.视频技术较为复杂,包括视频封装 ...

  7. 音视频开发一:音视频基础概念

    文章目录 基础概念 音频 声音介绍 种类 音质 声音存储的发展 采样频率 信号频率 声道 声道布局 音帧 帧时长 采样数 采样位数 存储空间 码流(比特率) 采样格式 音频编码(音频压缩) 音频解码 ...

  8. AI:人工智能领域之AI基础概念术语之机器学习、深度学习、数据挖掘中常见关键词、参数等5000多个单词中英文对照(绝对干货)

    AI:人工智能领域之AI基础概念术语之机器学习.深度学习.数据挖掘中常见关键词.参数等5000多个单词中英文对照(绝对干货) 导读      本博主基本收集了网上所有有关于ML.DL的中文解释词汇,机 ...

  9. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

最新文章

  1. python读中文文本_python读取中文txt文本
  2. 大数据如何有序地“变废为宝”
  3. 学习OpenCV——粒子滤波(网上两篇文章总结)
  4. T-SQL操作XML 数据类型方法 modify 的参数 1 必须是字符串文字。
  5. server sql 将出生日期转为年龄_在sql server表中有一个出生日期字段我怎么才能在当前年份改变时自动更新年龄字段...
  6. 针对故障场景的血液,汗液和书写自动集成测试
  7. 在MSF中怎么区分易混淆的工作项类型:Bug、风险和问题(我个人的理解)
  8. 【程序员面试干货】资深面试官告诉你:测试工程师面试要注意什么?
  9. 只有音频没指纹,能抓对人吗?CMU音频分析AI说没问题
  10. centos yum源_Linux入门珍藏课件系列第一讲:YUM源(图文)
  11. springboot logback 调整 mybatis 日志级别无效
  12. 关于mac的open命令
  13. 度假村酒店官方网站模板里面包含7个子页面,适合酒店住宿网站模板下载
  14. 2022年中式烹调师(技师)考试题库及答案
  15. 计算机科学与技术有没有博士,哪些高校有计算机科学与技术一级学科博士点?...
  16. Kotlin学习:标准函数(Standard.kt),run()、with()...
  17. 基于Java开发证券交易撮合系统的尝试
  18. wampserver 的Apache启动错误提示:The requested URL / was not found on this server
  19. 随着新日益增多的技术,如何正确的提升自己?
  20. 大数据开发工程师需要具备哪些技能?

热门文章

  1. c语言入口及出口参数说明,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...
  2. 基于MATLAB的交流电动机调速系统仿真
  3. 2021-03-01 Matlab 多项式的根求解
  4. matlab Retinex图像增强算法
  5. numpy.random.rand、numpy.random.randn
  6. 崩溃重启_semi-sync插件崩溃导致MySQL重启的故障分析-爱可生
  7. 骄傲的代价_JAVA
  8. 《深入理解Java虚拟机》笔记3——7种垃圾收集器
  9. Java源码分析之HashMap(JDK1.8)
  10. Java 单例模式探讨