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();
}
}
反射、晚期绑定和自定义特性的使用背景:
首先,可扩展的应用程序必须提供一些输入手段允许用户指定被插入的模块(比如一个对话框或命令标志)。这需要动态加载;
其次,为了插入到环境中,可扩展的应用程序必须要确定模块是否支持正确的功能(比如一组需要的接口),这需要反射;
最后,可扩展的应用程序必须获取一个需要的基础架构的引用(例如接口类型)并调用成员处罚底层功能。这需要晚期绑定。