c#反射入门篇(Reflection)——MethodInfo 发现方法的属性
网站: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();
结果
可以看出来invoke就是启动函数的 第一个是触发的类,第二个是要代入的参数
Type.GetMethod(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的函数方法
可以看出来如果不指定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();
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();
结果
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 发现方法的属性的更多相关文章
- 利用反射动态从程序集dll执行方法和属性
程序结构: //获取程序集 Assembly asb = Assembly.LoadFrom(path);//path为程序集的物理路径 //获取程序集下面的Student类 Type documen ...
- Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)
把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3 本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...
- 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...
- 一个App完成入门篇(七)- 完成发现页面
第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...
- java反射入门
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html package reflectTest; class Demo{ / ...
- C#反射 入门学习 02
获取Type类型的构造函数 前言 有了前面的 C#反射 入门学习 01的知识,学习这篇估计是搓搓有余,它教会了我们获取方法的相关信息的两种形式与 使用反射调用方法, ...
- C#秘密武器之反射——基础篇
先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator ...
- .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 ...
- 动静结合?Ruby 和 Java 的基础语法比较(入门篇)
前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...
随机推荐
- 盘点linux操作系统中的10条性能调优命令,一文搞懂Linux系统调优
原文链接:猛戳这里 性能调优一直是运维工程师最重要的工作之一,如果您所在的生产环境中遇到了系统响应速度慢,硬盘IO吞吐量异常,数据处理速度低于预期值的情况,又或者如CPU.内存.硬盘.网络等系统资源长 ...
- 基于Ryu的流量采集代码实现
1 from __future__ import division 2 import time 3 import math 4 import xlwt 5 from ryu.controller im ...
- C语言:标识符 关键字 保留字 表达式 语句
标识符(Identifier)标识符就是程序员自己起的名字,符号常量(宏).变量名.函数名.宏名.结构体名等,它们都是标识符.遵守规范:C语言规定,标识符只能由字母(A~Z, a~z).数字(0~9) ...
- ADB 关闭指定应用 并打开
import subprocess,time sjh="192.168.1.102:5555" aa1="adb -s {0} shell pm clear com.ku ...
- Installation failed with message INSTALL_FAILED_TEST_ONLY问题
Android Studio连接手机进行app调试,遇到如下问题: Installation failed with message INSTALL_FAILED_TEST_ONLY. It is p ...
- Java程序设计当堂测试 9.20
/*Java当堂测试 ATM机模拟系统由于学习的知识有限,不能完成所有课上项目,文件的应用没有完成,汇款转账功能也没有写,一些要求该退出的地方也没有写,基本功能还算完善*/ 1 package acc ...
- python -- 程序异常与调试(程序调试)
一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...
- CSS设置height为100%无效的情况
CSS设置height为100%无效的情况 笔者是小白,不是特别懂前端.今天写一个静态的HTML页面,然后想要一个div占据页面的100%,但是尝试了很多办法都没有实现,不知道什么原因. 后来取百度搜 ...
- Odoo开发规范
本文来源:https://www.jianshu.com/p/e892bf01f036 Odoo开发规范 模块结构 文件夹列表及对应作用 data/:演示和数据文件 models/:模型定义 cont ...
- 如何使用Git Flow 进行hotfix
前提是已经安装好git flow并做好配置.安装指导 1 首先确定你的紧急发布应基于那个分支(默认是mater/main分支,)并切换到对应分支. 2 git flow init--该命令会只指导你基 ...