国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

c#之反射總結(jié)

2019-11-17 03:19:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

c#之反射總結(jié)

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


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延庆县| 中江县| 曲阜市| 涞源县| 大悟县| 手机| 建阳市| 翁牛特旗| 广州市| 闽清县| 弥渡县| 岢岚县| 利津县| 广丰县| 庐江县| 平和县| 卢湾区| 琼中| 邵阳市| 达日县| 三穗县| 邓州市| 珲春市| 张掖市| 揭阳市| 辉南县| 邵阳市| 乐至县| 佛教| 辽源市| 讷河市| 祁门县| 贺州市| 炎陵县| 长沙市| 基隆市| 三门峡市| 和林格尔县| 朔州市| 南靖县| 定陶县|