日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#方法中的反射方式和委托方式(小实例)

發(fā)布時間:2025/5/22 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#方法中的反射方式和委托方式(小实例) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在開發(fā)過程中對靜態(tài)方法的調(diào)用是通過類型名后面加個點而后是調(diào)用方法的名稱,對類型實例方法的調(diào)用是通過new一個對象,而后點加方法名稱,這是最熟悉不過的兩種方式。還可以通過讀取CLR元數(shù)據(jù),利用反射進行方法調(diào)用。在利用反射方式調(diào)用方法時,最重要的兩個類是System.Type和System.Reflection.MethodInfo。用MethodInfo類型的Invoke方法調(diào)用方法,必須傳入目標對象實例的引用。如下:

public class Calculate
{
private int Add(int leftNum, int rightNum)
{
return leftNum + rightNum;
}
protected string Hello(string name)
{
return "你好:" + name;
}
}

委托方式

任何對象都可以調(diào)用委托,只要方法返回值以及方法簽名和委托聲明一樣就行。

public delegate int DelegateCaculate(int a,int b);
public class Calculatetest
{
public int Add(int num1, int num2)
{
return num1+num2;
}
public static int Subtract(int num1,int num2)
{
return num2 - num1;
}
}

控制臺調(diào)用:

class Program
{
static void Main(string[] args)
{
//用type.getmethod的方法獲取類型方法,BindingFlags設(shè)置查找方法的范圍
//本列是公有方法,私有方法而且是非靜態(tài)的才被查找,如果要查找靜態(tài)方法
//需要設(shè)置BindingFlags.Static
System.Reflection.MethodInfo method = typeof(Calculate).GetMethod("Add", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method == null)
return;
//調(diào)用方法的參數(shù)
object[] paras = { 10, 20 };
//目標對象實例:new Calculate()
object result = method.Invoke(new Calculate(), paras);
Console.WriteLine(result);
System.Reflection.MethodInfo mt = typeof(Calculate).GetMethod("Hello", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (mt == null)
return;
//調(diào)用方法的參數(shù)
object[] para = { "李光輝" };
object rs = mt.Invoke(new Calculate(), para);
Console.WriteLine(rs);
Console.ReadLine();

//委托的調(diào)用
DelegateCaculate add = new DelegateCaculate(new Calculatetest().Add);
DelegateCaculate subtract = new DelegateCaculate(Calculatetest.Subtract);
Console.WriteLine("add:" + add(10, 20));
Console.WriteLine("subtract:" + subtract(10, 20));
Console.ReadLine();
}
}

委托與接口

接口與委托都擁有調(diào)用特定方法的能力,所以他們在這點很相像。但是接口需要目標方法的類型聲明必須與該接口兼容,而委托可以被任何類型調(diào)用,只要該類型的目標方法簽名和委托簽名匹配即可。

那么何時用委托,何時用接口呢,msdn 總結(jié)的非常好,我就直接給粘貼過來了,

委托在以下情況很有用:

1、 調(diào)用單個方法。

2、 一個類希望有方法規(guī)范的多個實現(xiàn)。

3、 希望允許靜態(tài)方法實現(xiàn)規(guī)范。

4、 希望類似事件的設(shè)計模式。

5、 調(diào)用方不需要知道或獲得實現(xiàn)與委托簽名匹配的方法的對象。

6、 實現(xiàn)的提供程序希望只對少數(shù)選擇組件“分發(fā)”規(guī)范實現(xiàn)。

7、 需要方法的組合。

接口在以下情況很有用:

1、 規(guī)范定義一組相關(guān)方法。

2、 類通常只實現(xiàn)規(guī)范一次。

3、 接口的調(diào)用方希望轉(zhuǎn)換為接口類型或從接口類型轉(zhuǎn)換,以獲得其他接口或類。

1 private void callObjectEvent(Object obj, string EventName)
2 {
3 //建立一個類型,AssemblyQualifiedName拿出有效的名字
4 Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);
5 //參數(shù)對象
6 object[] p = new object[1];
7 //產(chǎn)生方法
8 MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);
9 //參數(shù)賦值。傳入函數(shù)
10 //獲得參數(shù)資料
11 ParameterInfo[] para = m.GetParameters();
12 //根據(jù)參數(shù)的名字,拿參數(shù)的空值。
13 p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");
14 //調(diào)用
15 m.Invoke(obj, p);
16 return;
17 }
18
19 //調(diào)用例子。
20 //調(diào)用Button1的onclick
21 callObjectEvent(Button1,"OnClick");
22
23 //調(diào)用Button5的OnKeyPress
24 callObjectEvent(Button5,"OnKeyPress");
25
26 //調(diào)用Text1的OnTextChanged
27 callObjectEvent(Text1, "OnTextChanged"); private void callObjectEvent(Object obj, string EventName, EventArgs e=null)
{
//建立一個類型
//Type t = typeof(obj.GetType);
Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);
//產(chǎn)生方法
MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);
//參數(shù)賦值。傳入函數(shù)
//獲得參數(shù)資料
ParameterInfo[] para = m.GetParameters();
//根據(jù)參數(shù)的名字,拿參數(shù)的空值。
//參數(shù)對象
object[] p = new object[1];
if (e == null)
p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");
else
p[0] = e;
//調(diào)用
m.Invoke(obj, p);
return;
}

//調(diào)用例子。
//調(diào)用Button1的onclick
callObjectEvent(Button1,"OnClick");
//調(diào)用Button5的OnKeyPress
callObjectEvent(Button5,"OnKeyPress");
//調(diào)用Text1的OnTextChanged
callObjectEvent(Text1, "OnTextChanged");
//調(diào)用Form的KeyPress事件, this就是那個winform, 并且傳入回車鍵
callObjectEvent(this, "OnKeyPress", new KeyPressEventArgs((char)13));







轉(zhuǎn)載于:https://www.cnblogs.com/liguanghui/archive/2011/12/01/2270761.html

總結(jié)

以上是生活随笔為你收集整理的C#方法中的反射方式和委托方式(小实例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。