1.反射:反射式一個運行庫類型發現的過程,通過反射,可以得到一個給定程序集所包含的所有類型的列表
(1)System.Type:
System.Type,該類是一個抽象類,該類定義了大量成員,可以用來檢查一個類型的元數據,從System.Reflection命名空間返回的類型非常多。Type.GetMethods()返回一個MethodInfo類型的數組,Type.GetFields()返回一個FieldInfo類型那個的數組。
如何得到Type引用:
System.Object.GetType():
SportsCar sc=new Sportscar();
Type t=sc.GetType();
System.Type.GetType():
Type t=Type.GetType(“CarLibrary.SportsCar”)
Typeof():
Type t=typeof(SportsCar);
2.用反射方法構建自定義的元數據查看器:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("*****Welcome to MyTypeViewer*****");
string typeName = "";
bool userIsDone = false;
do
{
Console.WriteLine("/nEnter a type name to ecaluate");
Console.WriteLine("or enter Q to quit");
typeName = Console.ReadLine();
if (typeName.ToUpper() == "Q")
{
userIsDone = true;
break;
}
try
{
Type t = Type.GetType(typeName);
Console.WriteLine();
ListVariousStats(t);
ListProps(t);
ListMethods(t);
}
catch
{
Console.WriteLine("Sorry,can't find type");
}
}
while (!userIsDone);
}
static void ListMethods(Type t)
{
Console.WriteLine("*****Method*****");
MethodInfo[] mi = t.GetMethods();
foreach (MethodInfo m in mi)
Console.WriteLine("->{0}", m.Name);
Console.WriteLine();
}
static void ListProps(Type t)
{
Console.WriteLine("*****Properties*****");
PropertyInfo[] pi = t.GetProperties();
foreach (PropertyInfo p in pi)
Console.WriteLine("->{0}", p.Name);
Console.WriteLine();
}
static void ListVariousStats(Type t)
{
Console.WriteLine("*****Various Statistics*****");
Console.WriteLine("Base class is:{0}", t.BaseType);
Console.WriteLine("Is type abstract?{0}", t.IsAbstract);
Console.WriteLine("Is type sealed?{0}", t.IsSealed);
Console.WriteLine("Is type generic?{0}", t.IsGenericParameter);
Console.WriteLine("Is type a class type?{0}", t.IsClass);
Console.WriteLine();
}
}
}
3.動態加載程序集:
System.Reflection定義了一個名爲Assembly的類,可以動態加載程序集,並找到關於程序集自身的屬性,還可以動態加載私有或恭喜那個程序集,還能夠加載任意位置的程序集。
4.晚期綁定:簡單地說,晚期綁定時一種創建一個給定類型的實例並在運行時調用其成員,而不需要在編譯時知道它存在的一種技術。
Activator.CreateInstance()方法是用來建立一個晚期綁定類型的實例:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("*****Fun with Late Binding*****");
Assembly a = null;
try
{
a = Assembly.Load("CarLibrary");
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
return;
}
Type miniVan = a.GetType("CarLibrary.Car+MiniVan");
object obj = Activator.CreateInstance(miniVan);
Console.WriteLine("Created a {0} using late bingding!", obj);
MethodInfo mi = miniVan.GetMethod("TurboBoost");
mi.Invoke(obj, null);
Console.ReadLine();
}
}
反射、晚期綁定和自定義特性的使用背景:
首先,可擴展的應用程序必須提供一些輸入手段允許用戶指定被插入的模塊(比如一個對話框或命令標誌)。這需要動態加載;
其次,爲了插入到環境中,可擴展的應用程序必須要確定模塊是否支持正確的功能(比如一組需要的接口),這需要反射;
最後,可擴展的應用程序必須獲取一個需要的基礎架構的引用(例如接口類型)並調用成員處罰底層功能。這需要晚期綁定。