我們繼續C#基礎知識的學習,這篇文章對前面基礎知識學習的朋友有著舉足輕重的作用;為了延續基礎知識學習的熱情,我編寫了這篇特殊的文章。
本篇文章的中心是想借“.NET簡談反射(動態呼叫)”一文繼續發揮下去,讓朋友能一氣呵成,到底反射能用在什麼地方,究竟能起到多麼高階的作用。
下面我就拿具體的例子講解,不廢話了請隨我來;
1:必須具備的基礎知識
C#介面:要想用反射進行高深的使用,必須先具備介面方面的基礎,只有用介面了才能是系統真真的活起來。參考.NET簡談介面 一文;
C#委託、事件:在動態呼叫的過程中,我們難免要進行一些資料的傳遞,這樣的傳遞是要用介面進行傳遞,我們不可能強耦合。參考.NET簡談事件與委託一文;
C#反射:這是最關鍵的一點,所有的東西都是圍繞這個點在轉,在我們下面的示例中,我們要動態的使用反射獲取介面物件。參考.NET簡談反射(動態呼叫) 一文;
2:示例內容介紹
示例的主要內容是圍繞著我們前面所學習的基礎知識的做統一應用,以鞏固我們的基礎,使我們能在真正的專案中靈活運用,將自己提升到一個新的高度;
都知道介面是規範,都知道事件委託,都知道反射,但是我們都只是知道這些零零散散的知識點,我們怎麼將這些小技術穿起來,形成堅實的程式碼結構;
示例要進行講解的大概內容是這樣的:我們定義一個介面,然後用物件去實現它,在我們使用的時候,我們動態的通過反射的去呼叫,但是反射的時候,我需要用介面進行確定唯一性,因為我們更本不知道誰實現了介面,所以介面的好處就出來了;
3:開始示例學習
定義介面:
using System;
using System.Collections.Generic;
using System.Text;
namespace MainInterface
{
/// <summary>
/// 成功計算後的委託
/// </summary>
/// <param name="count">返回計算後的值</param>
public delegate void AddHandler(int count);
/// <summary>
/// 新增方法介面
/// </summary>
public interface AddInterface
{
/// <summary>
/// 計算結束後的事件
/// </summary>
event AddHandler AddEndEvent;
/// <summary>
/// 計算兩個數的和
/// </summary>
/// <param name="i">number1</param>
/// <param name="j">number2</param>
void add(int i, int j);
}
}
實現介面:
using System;
using System.Collections.Generic;
using System.Text;
namespace TestDll
{
public class Math : MainInterface.AddInterface
{
#region AddInterface 成員
public event MainInterface.AddHandler AddEndEvent;
public void add(int i, int j)
{
AddEndEvent(i + j);
}
#endregion
}
}
具體呼叫:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Diagnostics;
namespace Reflection
{
class Program
{
static void Main(string[] args)
{
Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDll.dll");
foreach (Type type in dll.GetTypes())
{
if (type.GetInterface("MainInterface.AddInterface") != null)
{
MainInterface.AddInterface add = Activator.CreateInstance(type, true) as MainInterface.AddInterface;
add.AddEndEvent += new MainInterface.AddHandler(add_AddEndEvent);
add.add(10, 20);
}
}
}
static void add_AddEndEvent(int count)
{
Console.WriteLine("Invoke Method:\n" + count.ToString());
Console.ReadLine();
}
}
}
總結:所謂麻雀雖小,五臟俱全;上面的示例程式碼雖然沒什麼作用,但是基本上能概括我們日常所用到的;這也是我們進入框架開發、系統開發必經之路;