反射学习系列目录

反射学习系列1-反射入门

反射学习系列2-特性(Attribute)

反射学习系列3-反射实例应用

作者

Reflection,中文翻译为反射。这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
一、Type类于获取类型信息
System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。您可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。
大家运行一下下面的代码根据结果分析一下就能比较清楚的理解Type了

获取类型信息
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass m = new MyClass();
            Type type = m.GetType();
            Console.WriteLine("类型名:" + type.Name);
            Console.WriteLine("类全名:"+type.FullName);
            Console.WriteLine("命名空间名:"+type.Namespace);
            Console.WriteLine("程序集名:"+type.Assembly);
            Console.WriteLine("模块名:"+type.Module);
            Console.WriteLine("基类名:"+type.BaseType);
            Console.WriteLine("是否类:"+type.IsClass);
            Console.WriteLine("类的公共成员:");
            MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
            foreach (var item in memberInfos)
            {
                Console.WriteLine("{0}:{1}",item.MemberType,item);
            }
        }
        
    }
    class MyClass
    {
        public string m;
        public void test()
        { }
        public int MyProperty { get; set; }

}
}

二、获取程序集元数据
Assembly类定义了一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。因为程序集中是使用元数据进行自我描述的,所以我们就能通过其元数据得到程序集内部的构成。结合Assembly和反射能够获取程序集的元数据,但是首先要将程序集装入内存中。可以使用Assembly类的多种静态Load方法加载程序集。
下面的程序显示程序集的信息

Code
public static void Main()
        {
            //获取当前执行代码的程序集
            Assembly assem = Assembly.GetExecutingAssembly();

Console.WriteLine("程序集全名:"+assem.FullName);
            Console.WriteLine("程序集的版本:"+assem.GetName().Version);
            Console.WriteLine("程序集初始位置:"+assem.CodeBase);
            Console.WriteLine("程序集位置:"+assem.Location);
            Console.WriteLine("程序集入口:"+assem.EntryPoint);

Type[] types = assem.GetTypes();
            Console.WriteLine("程序集下包含的类型:");
            foreach (var item in types)
            {
                Console.WriteLine("类:"+item.Name);
            }
            
        }

三、动态加载类型
早绑定是在编译时绑定对象类型,而晚绑定是在运行时才绑定对象的类型。利用反射可以实现晚绑定,即动态加载类型,并调用他们的方法,下边是MSDN中的一个例子,详细的解释信息见注释

动态加载类型
namespace ConsoleApplication2
{
    public class Example
    {
        private int factor;
        public Example(int f)
        {
            factor = f;
        }

public int SampleMethod(int x)
        {
            Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
            return x * factor;
        }

public static void Main()
        {
            //获取当前执行代码的程序集
            Assembly assem = Assembly.GetExecutingAssembly();

Console.WriteLine("Assembly Full Name:");
            Console.WriteLine(assem.FullName);

// The AssemblyName type can be used to parse the full name.
            AssemblyName assemName = assem.GetName();
            Console.WriteLine("\nName: {0}", assemName.Name);
            Console.WriteLine("Version: {0}.{1}",
                assemName.Version.Major, assemName.Version.Minor);
            Console.WriteLine("\nAssembly CodeBase:");
            Console.WriteLine(assem.CodeBase);
            // 从程序集众创建一个Example实例并且用object类型的引用o指向它,同时调用一个输入参数的构造函数
            Object o = assem.CreateInstance("ConsoleApplication2.Example", false,
                BindingFlags.ExactBinding,
                null, new Object[] { 2 }, null, null);

//构造Example类的一个晚绑定的方法SampleMethod  
            MethodInfo m = assem.GetType("ConsoleApplication2.Example").GetMethod("SampleMethod");
            //调用刚才实例化好的Example对象o中的SampleMethod方法,传入的参数为42
            Object ret = m.Invoke(o, new Object[] { 42 });
            Console.WriteLine("SampleMethod returned {0}.", ret);

Console.WriteLine("\nAssembly entry point:");
            Console.WriteLine(assem.EntryPoint);
        }
    }

反射学习系列1-反射入门相关推荐

  1. 反射学习系列3-反射实例应用

    反射学习系列目录 反射学习系列1-反射入门 反射学习系列2-特性(Attribute) 反射学习系列3-反射实例应用 作者 例子这个东西其实挺难弄得,弄个简单的,虽然能说明问题但却容易让人觉得没实用价 ...

  2. 反射学习系列2-特性(Attribute)

    先看一个简单的例子 [Table(Name="dbo.[User]")] public partial class User { 当C#编译器发现这个属性有一个特性Table时,首 ...

  3. .net Dapper 学习系列(1) ---Dapper入门

    目录 写在前面 为什么选择Dapper 在项目中安装Dapper 在项目中使用Dapper 在项目中使用Dapper 进行单表增删改数据操作 总结 写在前面 Dapper 是一款轻量级ORM架构.为解 ...

  4. Android-音视频学习系列(一)-JNI-从入门到精通,android开发入门

    /** 1. 加载 native 库 */ static { System.loadLibrary("native-lib"); } @Override protected voi ...

  5. 反射学习4-通过反射机制动态创建和访问数组

    一.前言 java.lang.reflect.Array类提供了动态创建和访问数组元素的各种静态方法. static Object    newInstance(Class<?> comp ...

  6. Linux学习系列之Linux入门(一)linux安装与入门

    第一篇:安装并配置Linux开发环境 一.安装linux: 主要安装Linux的发行版,到目前为之,主要的发行版有: 比较常用的是Ubuntu.redhat和centOS,主要的安装方法详细: Ubu ...

  7. H5学习系列之webSocket入门

    Websocket 1.websocket是什么? WebSocket是为解决客户端与服务端实时通信而产生的技术.其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接, 此 ...

  8. Java基础与提高干货系列——Java反射机制

    前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...

  9. java反射机制深入详解_Java基础与提高干货系列——Java反射机制

    前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...

最新文章

  1. Linux下怎么诊断网站性能异常
  2. Json解析不允许子类父类变量重名的原因
  3. LeetCode N-ary Tree Level Order Traversal(bfs)
  4. 个人创业做什么好?以下这几个值得考虑
  5. AndroidStudio中使用XML和Java代码混合控制UI界面实现QQ相册照片列表页面
  6. C语言*运算符和运算符
  7. vb 发送html邮件,【VB】邮件发送功能
  8. 案例 月工作列表 c# 1614192274
  9. 无任何歧视!任正非:愿意把5G技术授权给一家美国公司
  10. html框架集frame是啥意思,HTML框架集frameset和内嵌框架iframe
  11. 如何找回丢失的Applications文件夹
  12. iOS “项目名” has conflicting provisioning settings.
  13. nc加载不了java,用友NC系统使用过程中常见问题和解决方法
  14. 黑莓BlackBerry 模拟器上浏览网页
  15. Docker容器实现跨宿主机通信
  16. 互联网运营中的“B端”、“C端”分别指什么?
  17. 开源的Jshop微信小程序商城源码
  18. Ant Design select下拉框突然拉长
  19. 局域网内通过ip获取主机名
  20. 大数据生态系统组件基础学习

热门文章

  1. 法国政府正考虑采用开源软件
  2. 【Java】HBase_thrift/thrift2_使用指南
  3. 读书笔记 effective c++ Item 47 使用traits class表示类型信息
  4. express 学习记录
  5. C# 连接 Exchange 发送邮件
  6. live555+ffmpeg如何提取关键帧(I帧,P帧,B帧)
  7. 【廖雪峰官方网站/Java教程】泛型
  8. 机器学习总结(一):线性回归、岭回归、Lasso回归
  9. 由A* = A^T推导问题
  10. vue+webapi 实现WebSocket 推送