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

首頁 > 學院 > 開發設計 > 正文

反射總結

2019-11-17 03:16:12
字體:
來源:轉載
供稿:網友

反射總結

反射

一、程序集

1、程序集

我們所寫的所有代碼都會編譯到程序集文件中,并在運行時以Assembly對象方式加載到內存中運行。

2、程序集的組成

運行時:

程序集:*.exe,.dll—>加載到內存中就是Assembly對象

類:每個class,interface—>加載到內存中就是Type對象

類的成員:方法、字段、屬性、事件---à加載到內存中也有相應的對象

二、反射

1、 在程序運行時,動態獲取加載程序集,動態獲取類型(如類、接口等),動態獲取類的成員信息(如方法,字段,屬性等)

2、 在運行時,動態創建類型實例,以調用和訪問這些實例成員。

Demo

 1   PRotected void Page_Load(object sender, EventArgs e) 2         { 3             //獲取當前運行程序(應用程序域)里的程序集,也就是程序跑起來用到的程序集。 4             //Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies(); 5         } 6  7         protected void Button1_Click(object sender, EventArgs e) 8         { 9             /**************************反射獲取類的成員***********************************/10             //獲取當前正在運行的程序集(Assembly)對象11             Assembly ass = this.GetType().Assembly;//this表示當前窗體12             //獲取程序集中dog類的類型(Type)對象13             Type tDog = ass.GetType("demo.Dog");14             //獲取dog類的name字段15             FieldInfo fInfo = tDog.GetField("name");16             //獲取方法17             MethodInfo mInfo = tDog.GetMethod("ShoutHi");18 19             /**************************反射調用類的成員***********************************/20             //根據Dog的Type對象,實例化一個Dog對象21             Dog d2 = Activator.CreateInstance(tDog) as Dog;//只能調用無參的構造函數22             //使用Dog類的name字段對象,為d2實例的name字段賦值23             fInfo.SetValue(d2, "小白");24             //使用Dog類的ShoutHi方法對象,執行d2實例的ShoutHi方法25             string strRes = mInfo.Invoke(d2, null) as string;26             27         }
View Code

三、Assembly程序集對象

獲取程序集的方式

1、獲得當前程序域中的所有Assembly:AppDomain.CurrentDomain.GetAssemblies() (如添加其他程序集,只有用到的時候才在程序域里面可以看到)

2、獲取當前對象的所在的Assembly:this.GetType().Assembly;

3、根據路徑加載Assembly:Assembly.LoadFrom(assPath)

獲取目前正在運行的程序集的物理路徑

string strAssPath=this.GetType().Assembly.Location;

四、Type類型對象

獲取Type對象的方式:

1、 通過類獲取相應的Type:Type t=typeof(Person)

2、 通過對象獲取Type:Type t=p.GetType()

3、 根據類的全名稱,獲取程序集中定義的類

Type type=Assembly.GetType(“BLL.Person”)

4、 獲取程序集中定義的所有的puble類:Type[] types=assembly.GetExportedTypes()

5、 獲取程序集中定義的所有的類型:Type[] types=assembly.GetTypes()

五、Type的成員

名稱

類型

用途

type.Assembly

屬性

獲取type所在的程序集對象

type.FullName

屬性

獲取type對象對應的類的全名稱

type.Name

屬性

獲取type對應的類的名稱

type.IsArray

屬性

判斷type是否為數組類

type.IsEnum

屬性

判斷type是否為枚舉類

type.IsAssignableFrom(Type i)

方法

判斷type是否實現了接口i

type.IsSubclassOf(Type father)

方法

判斷type是否繼承了father

type.IsInstanceOfType(object o)

方法

判斷o是否為type類型實例

type.GetFiled(“gender”)

方法

獲取type中名為”gender”的字段對象

type.GetMethod(“SayHi”)

方法

獲取type中名為”SayHi”的方法對象

type.GetProperty(“Age”)

方法

獲取type中名為”Age”的屬性字段

六、方法對象

1、獲取類中直接定義的(非繼承),實例的,公共方法

MethodInfo[] methods=o.GetMethods(BindingFlags.DeclaredOnly|BindingFlags.Instance|BingingFlags.Public);// o為對象對應的Type

2、 獲取類對象中的構造函數

ConstructorInfo[] constructors=t.GetConstructors();//t表示類獲取相應的Typeforeach(var c in constructors){ s+=c.GetParameters().Length.ToString();//獲取構造方法的參數長度}

如類Person,有三個構造函數Person(){},Person(string name){..},Person(string name,int age,bool gender),如何根據反射獲取到構造函數?

//注意:Activator.CreateInstance(o) 只能調用無參的構造函數

Type t=typeof(Person);ConstructorInfo constructor=null; Person p=null;

//根據無參的構造函數獲取對象:

constructor=t.GetConstructor(null);p= constructor.Invoke(null) as Person;

//通過三個參數的構造方法獲取對象

constructor=t.GetConstructor(new Types[3]{typeof(string),typeof(int),typeof(bool)});p= constructor.Invoke(new object[3]{“小王”,1,true}) as Person;

------------------------------------------------------------------------------------------------------------------------------------------

軟謀在線教育,最適合大學生、上班族的在線軟件培訓,主要教授asp.net動態網站制作,yy教育房間遠程實時授課,每節課錄制成高清視頻課后分享,老師白天八小時全職在線輔導,不懂就問。加QQ群:138800420 即可免費試聽。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿荣旗| 靖安县| 拉萨市| 迭部县| 秦安县| 浦城县| 伊宁市| 乡宁县| 衡山县| 泰宁县| 老河口市| 山阴县| 萨嘎县| 南丰县| 含山县| 墨玉县| 岳西县| 儋州市| 博罗县| 临沧市| 龙陵县| 津市市| 兰溪市| 西林县| 桑日县| 滦南县| 丘北县| 长春市| 芦山县| 蒙城县| 垫江县| 贵德县| 三明市| 东海县| 株洲县| 乌兰浩特市| 辽宁省| 思茅市| 通化县| 四会市| 贵南县|