1.發射是對類或者對象,查看其類內部的構造。數組
2.類的組成:屬性(PropertyInfo)、方法(MethodInfo)、字段(FiedInfo)、構造函數(ConstructorInfo)、事件(EventInfo)、參數(ParameterInfo)、程序集(Assembly)、模塊(Module)。函數
3.反射:用一種特殊的東西去窺探類並接收反射信息,經過反射信息來獲悉類的結構和信息(,就是從一個對象的外部去了解對象內部的構造)。測試
4.反射經常使用的命令空間:spa
System.Reflectionorm
System.Type對象
System.Reflection.Assembly接口
5. 經過Typeof()獲取對應的Type對象,Type 屬性能夠獲取到類的信息,Type的方法能夠獲取類內部信息,返回都是對應類型的數組,其對應類型對象有屬性(name,value)和方法(好比獲取 屬性信息GetCustomAttributes)。---------組合的模式。事件
6. 一般使用的方法ci
5.1 System.Type 類--經過這個類能夠訪問任何給定數據類型的信息。get
5.1.1 ●使用 C# typeof 運算符。
Type t = typeof(string); (類)
●使用對象GetType()方法。
string s = "grayworm";
Type t = s.GetType(); (對象)
●還能夠調用Type類的靜態方法GetType()。
Type t = Type.GetType("System.String"); (類)
上面這三類代碼都是獲取string類型的Type,在取出string類型的Type引用t後,咱們就能夠經過t來探測string類型的結構了。
string n = "grayworm";
Type t = n.GetType();
foreach (MemberInfo mi in t.GetMembers())
{
Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name);
}
Type類的屬性(typeof(),class.GetType(),obj.GetType() 返回Type類型,屬性和方法以下):
Name 數據類型名
FullName 數據類型的徹底限定名(包括命名空間名)
Namespace 定義數據類型的命名空間名
IsAbstract 指示該類型是不是抽象類型
IsArray 指示該類型是不是數組
IsClass 指示該類型是不是類
IsEnum 指示該類型是不是枚舉
IsInterface 指示該類型是不是接口
IsPublic 指示該類型是不是公有的
IsSealed 指示該類型是不是密封類
IsValueType 指示該類型是不是值類型
Type類的方法:
GetConstructor(), GetConstructors():返回ConstructorInfo[]類型,用於取得該類的構造函數的信息
GetEvent(), GetEvents():返回EventInfo[]類型,用於取得該類的事件的信息
GetField(), GetFields():返回FieldInfo[]類型,用於取得該類的字段(成員變量)的信息
GetInterface(), GetInterfaces():返回InterfaceInfo[]類型,用於取得該類實現的接口的信息
GetMember(), GetMembers():返回MemberInfo[]類型,用於取得該類的全部成員的信息
GetMethod(), GetMethods():返回MethodInfo[]類型,用於取得該類的方法的信息
GetProperty(), GetProperties():返回PropertyInfo[]類型,用於取得該類的屬性的信息
能夠調用這些成員,其方式是調用Type的InvokeMember()[]方法,或者調用MethodInfo, PropertyInfo和其餘類的Invoke()方法。
5.2 生成對象
第一種方法 (構造函數生成)
Type t = typeof(NewClassw);
Type[] pt = new Type[2]; (定義type類型數組)
pt[0] = typeof(string);
pt[1] = typeof(string);
//根據參數類型獲取構造函數
ConstructorInfo ci = t.GetConstructor(pt); (設定構造函數的類型)
//構造Object數組,做爲構造函數的輸入參數
object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};
//調用構造函數生成對象
object o = ci.Invoke(obj); (調用構造函數生成對象)
//調用生成的對象的方法測試是否對象生成成功
//((NewClassw)o).show();
第二種方法 ()
Type t = typeof(NewClassw);
//構造函數的參數
object[] obj = new object[2] { "grayworm", "hi.baidu.com/grayworm" };
//用Activator的CreateInstance靜態方法,生成新對象
object o = Activator.CreateInstance(t,"grayworm","hi.baidu.com/grayworm");
//((NewClassw)o).show();
5.3 System.Reflection.Assembly類--它能夠用於訪問給定程序集的信息,或者把這個程序集加載到程序中。
Assembly類能夠得到程序集的信息,也能夠動態的加載程序集,以及在程序集中查找類型信息,並建立該類型的實例。
使用Assembly類能夠下降程序集之間的耦合,有利於軟件結構的合理化。
經過程序集名稱返回Assembly對象
Assembly ass = Assembly.Load("ClassLibrary831");
經過DLL文件名稱返回Assembly對象
Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
經過Assembly獲取程序集中類
Type t = ass.GetType("ClassLibrary831.NewClass"); //參數必須是類的全名
經過Assembly獲取程序集中全部的類
Type[] t = ass.GetTypes();
//經過程序集的名稱反射
Assembly ass = Assembly.Load("ClassLibrary831");
Type t = ass.GetType("ClassLibrary831.NewClass");
object o = Activator.CreateInstance(t, "grayworm", "http://hi.baidu.com/grayworm");
MethodInfo mi = t.GetMethod("show");
mi.Invoke(o, null);
//經過DLL文件全名反射其中的全部類型
Assembly assembly = Assembly.LoadFrom("xxx.dll的路徑");
Type[] aa = a.GetTypes();
foreach(Type t in aa)
{
if(t.FullName == "a.b.c")
{
object o = Activator.CreateInstance(t);
}
}
5.3 運行獲取到attribute屬性(類的全部組成員,經過反射屬性、字段、方法獲取對應的對象,其對象中都有GetCustomAttributes()的方法)
BookInfo bookinfo = new BookInfo();
object[] bookarr;//對象數組
//獲取對象類型,使用typeof方法檢索當前的類類型也就是BookInfo
MemberInfo typeinfo = typeof(BookInfo); (應該是返回Type 待驗證)
//調用GetCustomAttributes方法獲取與BookAttribute類有關的屬性列表,該方法返回一個對象數組
bookarr = typeinfo.GetCustomAttributes(typeof(BookAttribute), false);
if (bookarr.GetLength(0) != 0)
{
BookAttribute bookattribute1 = (BookAttribute)bookarr[0];//獲取屬性類的第一個成員
BookAttribute bookattribute2 = (BookAttribute)bookarr[1];//獲取屬性類的第一個成員
Console.WriteLine(bookinfo.bookinfo);
Console.WriteLine("圖書名稱爲:" + bookattribute1.BookNmae + "—" + bookattribute2.BookNmae);
Console.ReadKey();
}