找回密码
 注册帐号

扫一扫,访问微社区

开果 c#反射入门篇(Reflection)——MethodInfo 发现方法的属性

8
回复
899
查看
[ 复制链接 ]

15

主题

25

帖子

218

积分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蛮牛币
87
威望
0
注册时间
2019-7-19
在线时间
164 小时
最后登录
2019-12-1
2019-8-10 17:48:49 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

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

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

1.如何获取?
Type.GetMethod(String) 获取该类的指定的名字String公开的函数方法 如果私有会为空
Type.GetMethod(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的函数方法
Type.GetMethods() 获取该类的所有公开的函数方法
Type.GetMethods(BindingFlags) 获取该类的所有指定类型BindingFlags的函数方法

例子
先定义个类型
[C#] 纯文本查看 复制代码
   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();

结果
蛮牛1.png
可以看出来invoke就是启动函数的 第一个是触发的类,第二个是要代入的参数

Type.GetMethod(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的函数方法
13838024-71e61d9465edbb57.png
可以看出来如果不指定BindingFlags是搜索不到了

看看加上之后的

[C#] 纯文本查看 复制代码
            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();

蛮牛2.png
Type.GetMethods() 获取该类的所有公开的函数方法
Type.GetMethods(BindingFlags) 获取该类的所有指定类型BindingFlags的函数方法
  
[C#] 纯文本查看 复制代码
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();

结果
蛮牛3.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[] { "凉_开果"});
结果
蛮牛4.png
可以看出来invoke就是启动函数的 第一个是触发的类,第二个是要代入的参数
转成委托 Delegate CreateDelegate(Type delegateType, object target);
和Delegate的CreateDelegate一样的就是少写了个指定MethodInfo 大概用途是 注册事件时候,需要反射出函数的委托进行注册,

   
[C#] 纯文本查看 复制代码
    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();
    }

结果
蛮牛5.png
可以看出 事件注册之前没东西的通过转化成的委托进行注册 就有了 第二个赋值的是包含这个函数的实例化对象
找到拥有该函数初始父类 MethodInfo GetBaseDefinition();
当在派生类中被重写时,为直接或间接的基类上的方法返回MethodInfo 就是找到他的 谁创建的这个函数
先声明代码
  
[C#] 纯文本查看 复制代码
  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();
           }
       }

例子
[C#] 纯文本查看 复制代码
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();

结果
蛮牛6.png

回复

使用道具 举报

7日久生情
2553/5000
排名
4094
昨日变化

0

主题

1770

帖子

2553

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
2292
威望
0
注册时间
2017-11-16
在线时间
421 小时
最后登录
2019-12-13
2019-8-12 08:07:30 显示全部楼层
666666666666666666666666
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1074/1500
排名
10708
昨日变化

0

主题

777

帖子

1074

积分

Rank: 6Rank: 6Rank: 6

UID
301976
好友
1
蛮牛币
1590
威望
0
注册时间
2018-10-31
在线时间
199 小时
最后登录
2019-12-13
2019-8-12 10:25:39 显示全部楼层
   Nice  。。
回复 支持 反对

使用道具 举报

5熟悉之中
720/1000
排名
15911
昨日变化

6

主题

420

帖子

720

积分

Rank: 5Rank: 5

UID
313764
好友
2
蛮牛币
659
威望
0
注册时间
2019-2-13
在线时间
258 小时
最后登录
2019-12-14
2019-8-12 11:37:05 显示全部楼层
66666666666666666666666666666
回复 支持 反对

使用道具 举报

排名
64938
昨日变化

1

主题

9

帖子

21

积分

Rank: 1

UID
112808
好友
0
蛮牛币
3
威望
0
注册时间
2015-7-9
在线时间
9 小时
最后登录
2019-8-12
2019-8-12 13:47:00 显示全部楼层
assdfasdfasdfasd
回复 支持 反对

使用道具 举报

排名
64938
昨日变化

1

主题

9

帖子

21

积分

Rank: 1

UID
112808
好友
0
蛮牛币
3
威望
0
注册时间
2015-7-9
在线时间
9 小时
最后登录
2019-8-12
2019-8-12 13:49:02 显示全部楼层
asdfasdfasdfasdfasdfasd
回复 支持 反对

使用道具 举报

7日久生情
2553/5000
排名
4094
昨日变化

0

主题

1770

帖子

2553

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
2292
威望
0
注册时间
2017-11-16
在线时间
421 小时
最后登录
2019-12-13
2019-8-13 08:09:18 显示全部楼层
66666666666666666666
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1074/1500
排名
10708
昨日变化

0

主题

777

帖子

1074

积分

Rank: 6Rank: 6Rank: 6

UID
301976
好友
1
蛮牛币
1590
威望
0
注册时间
2018-10-31
在线时间
199 小时
最后登录
2019-12-13
2019-8-19 10:33:34 显示全部楼层
感谢大佬分享。。。
回复

使用道具 举报

排名
9400
昨日变化

13

主题

230

帖子

1142

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
16
蛮牛币
89
威望
0
注册时间
2014-4-14
在线时间
618 小时
最后登录
2019-12-14

认证开发者

2019-8-19 11:50:08 显示全部楼层
好文章 必须支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则