网站:https://www.jianshu.com/p/52dc85668d00

也算记录自己的学习篇=。= 适合入门看 这里简单介绍下MethodInfo和他基本的几个方法

简介

MethodInfo就是通过反射指定类获取到的 属性并提供对方法函数数据的访问。

1.如何获取?

Type.GetMethod(String) 获取该类的指定的名字String公开的函数方法 如果私有会为空

Type.GetMethod(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的函数方法

Type.GetMethods() 获取该类的所有公开的函数方法

Type.GetMethods(BindingFlags) 获取该类的所有指定类型BindingFlags的函数方法

例子

先定义个类型
   public class Method
{
public int A;
public string B; public void M(string data)
{
Console.WriteLine(data);
} public void M1()
{
Console.WriteLine("M1");
}
private void M2()
{
Console.WriteLine("M2");
}
}
Type.GetMethod(String) 获取该类的指定的名字String公开的函数方法 如果私有会为空
        typeof(Method).GetMethod("M1").Invoke(method,null);
typeof(Method).GetMethod("M").Invoke(method, new string[] { "凉_开果"}); Console.ReadKey();

结果

 

 
image.png

可以看出来invoke就是启动函数的 第一个是触发的类,第二个是要代入的参数

Type.GetMethod(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的函数方法
 

image.png

可以看出来如果不指定BindingFlags是搜索不到了

看看加上之后的

            typeof(Method).GetMethod("M1").Invoke(method,null);
typeof(Method).GetMethod("M").Invoke(method, new string[] { "凉_开果"});
typeof(Method).GetMethod("M2",BindingFlags.Instance|BindingFlags.NonPublic).Invoke(method, null);//BindingFlags.Instance(对象) 和 BindingFlags.Static(静态) 必须有一个,
Console.ReadKey();
 

image.png
Type.GetMethods() 获取该类的所有公开的函数方法
Type.GetMethods(BindingFlags) 获取该类的所有指定类型BindingFlags的函数方法
  MethodInfo[] Methods1=  typeof(Method).GetMethods();
MethodInfo[] Methods2 = typeof(Method).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic); foreach (var item in Methods1)
{
Console.WriteLine("不加BindingFlags" + item.Name);
} foreach (var item in Methods2)
{
Console.WriteLine("加BindingFlags" + item.Name);
} Console.ReadKey();

结果

 

image.png

2.属性

这里就列几个基础的=。=完全的可以自己 去看c#的API

属性 作用
ReturnType 获取这个函数方法返回的类型
MemberType 返回一个MemberTypes枚举表示 他是个方法。
DeclaringType 获取是谁声明该模块成员的类的Type
还有一堆is开头的bool属性 都是字面意思 就是判断是否含有

3.方法 =。=我就写下基础的几个

  • 接着上面声明的类就好

  • 运行函数Invoke(object obj, object[] parameters);

    • 上面已经用过了
    •   typeof(Method).GetMethod("M1").Invoke(method,null);
      typeof(Method).GetMethod("M").Invoke(method, new string[] { "凉_开果"});
    • image.png
    • 可以看出来invoke就是启动函数的 第一个是触发的类,第二个是要代入的参数
  • 转成委托 Delegate CreateDelegate(Type delegateType, object target);

    • 和Delegate的CreateDelegate一样的就是少写了个指定MethodInfo 大概用途是 注册事件时候,需要反射出函数的委托进行注册,

    •        static event Action A1;
      static event Action<string> A2; static void Main(string[] args)
      { Method Instance = Activator.CreateInstance(typeof(Method)) as Method; A1?.Invoke();
      Console.WriteLine("没注册之前");
      A1+= Instance.GetType().GetMethod("M1").CreateDelegate(typeof(Action), Instance) as Action;
      A1?.Invoke();
      Console.WriteLine("注册之后"); Console.ReadKey();
      }
    • 结果
       

       
      image.png
      • 可以看出 事件注册之前没东西的通过转化成的委托进行注册 就有了 第二个赋值的是包含这个函数的实例化对象
  • 找到拥有该函数初始父类 MethodInfo GetBaseDefinition();

    • 当在派生类中被重写时,为直接或间接的基类上的方法返回MethodInfo 就是找到他的 谁创建的这个函数
    • 先声明代码
      •     public class BaseMethod
        {
        public virtual void M3()
        { }
        } public class Method: BaseMethod
        {
        public int A;
        public string B; public void M( string data)
        {
        Console.WriteLine(data);
        } public void M1()
        {
        Console.WriteLine("M1");
        }
        private void M2(int data)
        {
        Console.WriteLine("M2");
        } public override void M3()
        {
        base.M3();
        }
        }
    • 例子
      •  Console.WriteLine(typeof(Method).GetMethod("M3").ReflectedType.Name);
        Console.WriteLine("创建他的父类"+typeof(Method).GetMethod("M3").GetBaseDefinition().ReflectedType.Name); Console.WriteLine(typeof(Method).GetMethod("ToString").ReflectedType.Name);
        Console.WriteLine("创建他的父类" + typeof(Method).GetMethod("ToString").GetBaseDefinition().ReflectedType.Name);
        Console.ReadKey();
      • 结果
         

        image.png

作者:懒_开果
链接:https://www.jianshu.com/p/52dc85668d00
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

c#反射入门篇(Reflection)——MethodInfo 发现方法的属性的更多相关文章

  1. 利用反射动态从程序集dll执行方法和属性

    程序结构: //获取程序集 Assembly asb = Assembly.LoadFrom(path);//path为程序集的物理路径 //获取程序集下面的Student类 Type documen ...

  2. Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)

    把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3  本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...

  3. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  4. 一个App完成入门篇(七)- 完成发现页面

    第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...

  5. java反射入门

    http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html package reflectTest; class Demo{ / ...

  6. C#反射 入门学习 02

    获取Type类型的构造函数 前言                  有了前面的 C#反射 入门学习 01的知识,学习这篇估计是搓搓有余,它教会了我们获取方法的相关信息的两种形式与 使用反射调用方法,  ...

  7. C#秘密武器之反射——基础篇

    先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator ...

  8. .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压

    以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  9. 动静结合?Ruby 和 Java 的基础语法比较(入门篇)

    前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...

随机推荐

  1. python 14篇 写日志

    import sys from loguru import logger # 日志级别: debug 调试信息打印日志比较详细,级别最低 # info 正常的提示信息,级别较低 # waring 警告 ...

  2. C语言:类型转换

    1.自动类型转换:将小范围数据类型转换为大范围的数据类型 2.赋值号两边的数据类型不一致时,会自动将右边的数据类型转换为左边的数据类型.若右边数据的类型级别高,则根据左边变量的长度截取低字节数据部分 ...

  3. WinForm使用DataGridView实现类似Excel表格的查找替换

    在桌面程序开发过程中我们常常使用DataGridView作为数据展示的表格,在表格中我们可能要对数据进行查找或者替换. 其实要实现这个查找替换的功能并不难,记录下实现过程,不一定是最好的方式,但它有用 ...

  4. Kubernetes实战:高可用集群的搭建和部署

    摘要:官方只提到了一句"使用负载均衡器将 apiserver 暴露给工作节点",而这恰恰是部署过程中需要解决的重点问题. 本文分享自华为云社区<Kubernetes 高可用集 ...

  5. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十一集补充:修改fastdfs的http.conf文件进行防盗链,重启nginx失败】

    1,进入fastdfs的安装目录: 2,修改http.conf文件,详情可参考: https://www.cnblogs.com/xiaolinstudy/p/9341779.html 3,重启ngi ...

  6. MySQL检查与性能优化示例脚本

    最近在玩python,为了熟悉一下python,写了个mysql的检查与性能优化建议的脚本. 虽然,真的只能算是一个半成残次品.也拿出来现眼一下. 不过对于初学者来说,还是有一定的参考价值的.比如说如 ...

  7. xampp的Apache服务无法启动 Apache的443端口被占用解决方法

    今天在使用本地的XAMPP的时候,发现Apache服务不能正常启动,根据以往的经验,可能是80端口或者443端口被占用导致的,所以对端口占用情况进行排查. 1. 执行xampp/apache/bin中 ...

  8. python 连接mysql数据库操作

    import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', ...

  9. nodejs 文本逐行读写功能的实现

    利用nodejs实现:逐行读写(从一个文件逐行复制到另外一个文件):逐行读取.处理和写入(读取一行,处理后,写入另一个文件) 1.所需要的模块: fs,os,readline 2.具体实现: a. 功 ...

  10. 使用Visual Studio进行文件差异比较

    启动VS自带的文件差异比较工具,进行代码文本比较,省去安装第三方工具的麻烦. 一.启动VS命令窗口. 依次点击菜单[视图]>>[其它窗口]>>[命令窗口],如下图所示,启动命令 ...