1、了解什么事程序集

2、加載程序集
首先要加載需要加載的程序集,然后找到指定的類(lèi)型,進(jìn)而往下進(jìn)行動(dòng)態(tài)加載。
要加載的程序集中的內(nèi)容:

1 public class Class1:Person 2 { 3 PRivate string name; 4 private int age; 5 private void SayHi() 6 { 7 Console.WriteLine("hello shit!"); 8 } 9 }10 11 public delegate void VoidDel();12 13 public class MyClass14 {15 private void MySayHi()16 {17 Console.WriteLine("my hello shit!");18 }19 }20 internal enum Hopppy21 {22 游泳,23 籃球,24 足球25 }26 27 public class Person28 {29 public string Name { set; get; }30 public int Age { set; get; }31 32 public void Shit()33 {34 Console.WriteLine("I love you,shit!");35 }36 }37 38 public class Chinses : Person, IXiFuable39 {40 public string Hoppy { set; get; }41 42 public void XiFu()43 {44 Console.WriteLine("中國(guó)人又自我修復(fù)的功能!");45 }46 }47 48 interface IXiFuable49 {50 void XiFu();51 }52 53 public abstract class MyAbsClass54 {55 }程序集中的內(nèi)容加載程序集:
1 //反射:命名空間(System.Reflection;);用于指向特定的程序集,返回程序集的元數(shù)據(jù)2 3 //加載程序集(Assembly:程序集)4 Assembly asm = Assembly.LoadFile(@"C:/練習(xí)/委托和多線程/基礎(chǔ)練習(xí)/clRefletor/bin/Debug/clRefletor.dll");
獲得程序集下面的所有類(lèi)型(包括私有的和internal)
1 Type[] types = asm.GetTypes();2 foreach (var item in types)3 {4 //(包括私有和internal)類(lèi)型名稱(chēng) 命名空間 命名空間.類(lèi)型名稱(chēng)5 Console.WriteLine("Name:" + item.Name + ";namespace:" + item.Namespace + ";FullName:" + item.FullName);6 }獲得程序集下面所有的“公有”的類(lèi)型
Type[] ExportedTypes= asm.GetExportedTypes();
3、獲得指定類(lèi)型的三種方法(反射的核心)
含有一個(gè)測(cè)試的Person類(lèi):
1 public class Person2 {3 public string Name { set; get; }4 public int Age { set; get; }5 }獲得Type的三種方法
1 //1、通過(guò) 實(shí)例對(duì)象的GetType()方法 2 Person person = new Person(); 3 Type type1 = person.GetType(); 4 5 //2、通過(guò) typeof(對(duì)象的類(lèi)型名(例如:Person(就是類(lèi)Person))) 6 Type type2 = typeof(Person); 7 8 //3、通過(guò) 程序集Assembly 9 Assembly asm = Assembly.LoadFile("擴(kuò)展程序集的地址");10 Type type3 = asm.GetType("Person"); 4、Type類(lèi)型的動(dòng)態(tài)調(diào)用成員

得到類(lèi)型之后,就能找到他下面的所有的屬性、字段、方法、接口、事件等
獲得Type下面的所有的”公有“屬性:
Type asmType = asm.GetType("clRefletor.Class1", true, false);//第一個(gè)是“類(lèi)型的全名”,第二個(gè)參數(shù):找不到時(shí)觸發(fā)異常,第三個(gè)參數(shù):尋找的時(shí)候是否忽略大小寫(xiě) PropertyInfo[] propInfos = asmType.GetProperties(); foreach (var item in propInfos) { Console.WriteLine("屬性Name:" + item.Name + "屬性的類(lèi)型名稱(chēng):" + item.PropertyType.Name + ";是否可讀:" + item.CanRead + ";是否可寫(xiě):" + item.CanWrite); }獲得Type下面的所有的“公有”方法:
1 //這個(gè)時(shí)候 會(huì)將所有的方法全部都 取出來(lái),包括 繼承父類(lèi)的方法和 屬性執(zhí)行的兩個(gè)方法(非private和非protected的方法)2 MethodInfo[] asmMenthods = asmType.GetMethods();3 foreach (var asmMethod in asmMenthods)4 {5 Console.WriteLine(asmMethod.Name + ";聲明此方法的類(lèi):" + asmMethod.DeclaringType.Name + asmMethod);6 }上面 動(dòng)態(tài)獲得的都是“公有”,要想獲得私有的要進(jìn)行設(shè)置
獲得私有的方法:
1 Type typePerson=typeof(Person);2 //獲得非私有的 方法( BindingFlags.NonPublic | BindingFlags.Instance主要靠這個(gè)枚舉)3 MethodInfo perMethod= typePerson.GetMethod("SayHi", BindingFlags.NonPublic | BindingFlags.Instance);4 object obj = Activator.CreateInstance(typePerson);5 perMethod.Invoke(obj, null);//方法沒(méi)有參數(shù),所以傳值 為null6 //獲得所有的 非公有的方法7 MethodInfo[] perMothods = typePerson.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance);動(dòng)態(tài)獲得其他內(nèi)容就不在演示,基本都一樣。
5、通過(guò)Type創(chuàng)建對(duì)應(yīng)的實(shí)例對(duì)象,進(jìn)而通過(guò)反射設(shè)置其屬性的值、取到屬性的值、調(diào)用對(duì)應(yīng)的方法等
通過(guò)Type類(lèi)型創(chuàng)建實(shí)例對(duì)象
1 //獲得當(dāng)前類(lèi)的實(shí)例,,就可以 賦值 此類(lèi)的屬性 和取得屬性的值,還可以執(zhí)行此類(lèi)中的 方法(都是共有的,因?yàn)樗接械娜〔坏剑? object classTarget = Activator.CreateInstance(asmType);
通過(guò)實(shí)例對(duì)象對(duì)屬性賦值
1 //為屬性賦值2 var pror = asmType.GetProperty("Name");3 pror.SetValue(classTarget, "shit",null);//第三個(gè)參數(shù) 只有索引才填4 Console.WriteLine(pror.GetValue(classTarget,null));通過(guò)實(shí)例對(duì)象調(diào)用指定的方法
1 //執(zhí)行 通過(guò)反射得到的方法2 MethodInfo method = asmType.GetMethod("Shit");3 method.Invoke(classTarget, null);//第一個(gè)參數(shù):如果方法是靜態(tài)方法,就傳遞一個(gè)null就可以了,如果是實(shí)例方法,就是調(diào)用此方法的 對(duì)象(這里是Class1);第二個(gè)參數(shù):object數(shù)組:傳到方法里面的 參數(shù)(參數(shù)的個(gè)數(shù)不同,可以識(shí)別 方法的重載)6、Type類(lèi)型常用的驗(yàn)證方法和需要注意點(diǎn)
首先獲得下面需要用到的類(lèi)型
1 Assembly asm = Assembly.LoadFile(@"C:/練習(xí)/委托和多線程/基礎(chǔ)練習(xí)/clRefletor/bin/Debug/clRefletor.dll");2 Type typePerson = asm.GetType("clRefletor.Person");3 Type typeChinese = asm.GetType("clRefletor.Chinses");4 Type typeIXiufuable = asm.GetType("clRefletor.IXiFuable");5 Type typeAbsClass = asm.GetType("clRefletor.MyAbsClass");1》IsAssignableFrom(Type)
判斷方法里的類(lèi)型是否可以賦值給當(dāng)前類(lèi)型。(注意:接口和父類(lèi)都可以)
1 bool b1 = typePerson.IsAssignableFrom(typeChinese);//True2 bool b2 = typeIXiufuable.IsAssignableFrom(typeChinese);//True
2》IsInstanceOfType(實(shí)例對(duì)象)
判斷括號(hào)中的實(shí)例對(duì)象是否當(dāng)前類(lèi)型的實(shí)例。(注意:父類(lèi)類(lèi)型、接口類(lèi)型、當(dāng)前類(lèi)型都可以)
1 //動(dòng)態(tài)創(chuàng)建對(duì)象(含有無(wú)參構(gòu)造函數(shù))2 object objChinese = Activator.CreateInstance(typeChinese);3 4 bool b1 = typeChinese.IsInstanceOfType(objChinese);//True5 bool b2 = typePerson.IsInstanceOfType(objChinese);//True6 bool b3 = typeIXiufuable.IsInstanceOfType(objChinese);//True
3》IsSubclassOf(Type)
判斷當(dāng)前類(lèi)型是否是括號(hào)中類(lèi)型的子類(lèi)。(注意:父類(lèi)可以,但是接口不行)
1 bool b1 = typeChinese.IsSubclassOf(typePerson);//True2 bool b2 = typeChinese.IsSubclassOf(typeIXiufuable);//False
4》IsAbstract屬性
判斷當(dāng)前類(lèi)型是否是抽象的。(注意:抽象的:是指只要不能實(shí)例化就是,比如:靜態(tài)類(lèi)、密封類(lèi)、接口等)
1 Console.WriteLine(typeChinese.IsAbstract);//True2 Console.WriteLine(typePerson.IsAbstract);//True3 Console.WriteLine(typeIXiufuable.IsAbstract);//False4 Console.WriteLine(typeAbsClass.IsAbstract);//False
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注