C#方法中的反射方式和委托方式(小实例)
在開發(fā)過程中對(duì)靜態(tài)方法的調(diào)用是通過類型名后面加個(gè)點(diǎn)而后是調(diào)用方法的名稱,對(duì)類型實(shí)例方法的調(diào)用是通過new一個(gè)對(duì)象,而后點(diǎn)加方法名稱,這是最熟悉不過的兩種方式。還可以通過讀取CLR元數(shù)據(jù),利用反射進(jìn)行方法調(diào)用。在利用反射方式調(diào)用方法時(shí),最重要的兩個(gè)類是System.Type和System.Reflection.MethodInfo。用MethodInfo類型的Invoke方法調(diào)用方法,必須傳入目標(biāo)對(duì)象實(shí)例的引用。如下:
public class Calculate{
private int Add(int leftNum, int rightNum)
{
return leftNum + rightNum;
}
protected string Hello(string name)
{
return "你好:" + name;
}
}
委托方式
任何對(duì)象都可以調(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;
}
}
控制臺(tái)調(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 };
//目標(biāo)對(duì)象實(shí)例: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)用特定方法的能力,所以他們?cè)谶@點(diǎn)很相像。但是接口需要目標(biāo)方法的類型聲明必須與該接口兼容,而委托可以被任何類型調(diào)用,只要該類型的目標(biāo)方法簽名和委托簽名匹配即可。
那么何時(shí)用委托,何時(shí)用接口呢,msdn 總結(jié)的非常好,我就直接給粘貼過來了,
委托在以下情況很有用:
1、 調(diào)用單個(gè)方法。
2、 一個(gè)類希望有方法規(guī)范的多個(gè)實(shí)現(xiàn)。
3、 希望允許靜態(tài)方法實(shí)現(xiàn)規(guī)范。
4、 希望類似事件的設(shè)計(jì)模式。
5、 調(diào)用方不需要知道或獲得實(shí)現(xiàn)與委托簽名匹配的方法的對(duì)象。
6、 實(shí)現(xiàn)的提供程序希望只對(duì)少數(shù)選擇組件“分發(fā)”規(guī)范實(shí)現(xiàn)。
7、 需要方法的組合。
接口在以下情況很有用:
1、 規(guī)范定義一組相關(guān)方法。
2、 類通常只實(shí)現(xiàn)規(guī)范一次。
3、 接口的調(diào)用方希望轉(zhuǎn)換為接口類型或從接口類型轉(zhuǎn)換,以獲得其他接口或類。
1 private void callObjectEvent(Object obj, string EventName)2 {
3 //建立一個(gè)類型,AssemblyQualifiedName拿出有效的名字
4 Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);
5 //參數(shù)對(duì)象
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)
{
//建立一個(gè)類型
//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ù)對(duì)象
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就是那個(gè)winform, 并且傳入回車鍵
callObjectEvent(this, "OnKeyPress", new KeyPressEventArgs((char)13));
轉(zhuǎn)載于:https://www.cnblogs.com/liguanghui/archive/2011/12/01/2270761.html
總結(jié)
以上是生活随笔為你收集整理的C#方法中的反射方式和委托方式(小实例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel 计算时间差
- 下一篇: 自定义时间格式 返回年月日