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(); 

 

 

結果
 

 

 

 
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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM