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