二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當(dāng)前位置: 首頁(yè) » 企資快訊 » 本地要聞 » 正文

        C也自學(xué)——反是(Reflection)

        放大字體  縮小字體 發(fā)布日期:2023-05-04 03:05:21    作者:江炫煌    瀏覽次數(shù):93
        導(dǎo)讀

        反射是很多框架都用到得東西,是從0.25到0.5得一個(gè)進(jìn)階反射專(zhuān)業(yè)動(dòng)態(tài)創(chuàng)建對(duì)象,動(dòng)態(tài)賦值,動(dòng)態(tài)調(diào)用方法反射專(zhuān)業(yè)在運(yùn)行時(shí)獲的類(lèi)得信息每個(gè)類(lèi)都有一個(gè) type對(duì)象,構(gòu)造方法對(duì)應(yīng)得是 ConstructorInfo對(duì)象,方法對(duì)應(yīng)得是 M

        反射是很多框架都用到得東西,是從0.25到0.5得一個(gè)進(jìn)階

        反射專(zhuān)業(yè)動(dòng)態(tài)創(chuàng)建對(duì)象,動(dòng)態(tài)賦值,動(dòng)態(tài)調(diào)用方法

        反射專(zhuān)業(yè)在運(yùn)行時(shí)獲的類(lèi)得信息

        每個(gè)類(lèi)都有一個(gè) type對(duì)象,構(gòu)造方法對(duì)應(yīng)得是 ConstructorInfo對(duì)象,方法對(duì)應(yīng)得是 MethodInfo對(duì)象,字段對(duì)應(yīng)得是 FieldInfo對(duì)象,屬性對(duì)應(yīng)得是 PropertyInfo對(duì)象,使用時(shí)需要引用using System.Reflection;

        Type

        class Dog:Animal{ public string name; public int age; double price; static double weight; public Dog() { } public Dog(string name) { } public Dog(string name,int age) { } public override void Say() { } public double Price { get; set; } public double Weight { get; set; }}class Animal{ public virtual void Say() { }}class Print{ static void Main() { Dog dog = new Dog(); // 獲取類(lèi)得 type 對(duì)象常用得三種方式 Type type = typeof(Dog); Type type1 = dog.GetType(); Type type2 = Type.GetType("Application.Dog"); //假設(shè)只知道類(lèi)得名字,利用類(lèi)名創(chuàng)建對(duì)象實(shí)例 Type t = typeof(Dog); // Activator.CreateInstance(t); 被實(shí)例化得對(duì)象必須有無(wú)參構(gòu)造方法,沒(méi)有則會(huì)拋出 MissingMethodException 缺失方法異常 object dog1 = Activator.CreateInstance(t); // 相當(dāng)于 new Dog();,由于返回得是 object ,所以只能用 object 接收 Console.WriteLine(dog1); Console.WriteLine(t.baseType); // 獲取父類(lèi) Console.WriteLine(t.Name); // 獲取類(lèi)名 Console.WriteLine(t.FullName); // 獲取全名,包含命名空間 Console.WriteLine(t.IsAbstract); // 判斷是否為 抽象類(lèi) Console.WriteLine(t.IsArray); // 是否為 數(shù)組 Console.WriteLine(t.IsClass); // 是否為 普通類(lèi) Console.WriteLine(t.IsEnum); // 是否為 枚舉 Console.WriteLine(t.IsPublic); // 是否為 public Console.WriteLine(t.IsValueType); // 是否為 值類(lèi)型 Console.WriteLine("------------gov 構(gòu)造方法 gov---------------"); // 獲取無(wú)參構(gòu)造方法 t.GetConstructor(new Type[0]); 參數(shù)要求是 type對(duì)象數(shù)組,因此無(wú)參構(gòu)造就只需要入?yún)㈤L(zhǎng)度為 0 得數(shù)組就好了 ConstructorInfo c1 = t.GetConstructor(new Type[0]); Console.WriteLine(c1); // Void .ctor ctor是IL里面構(gòu)造方法得表現(xiàn)方式 // 獲取參數(shù)類(lèi)型為 string 得構(gòu)造方法 c1 = t.GetConstructor(new Type[] { typeof(string) }); Console.WriteLine(c1); // 獲取參數(shù)類(lèi)型為 string,int 得構(gòu)造方法 c1 = t.GetConstructor(new Type[] { typeof(string), typeof(int) }); Console.WriteLine(c1); Console.WriteLine("------------gov 字段 gov---------------"); // 獲取所有字段,必須是public,獲取得是未封裝得字段 FieldInfo[] f1 = t.GetFields(); foreach (var field in f1) { Console.WriteLine(field); } // 獲取 非public,且 非static 得字段,如果需要獲取 static得,把Instance改成static f1 = t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var field in f1) { Console.WriteLine(field); } Console.WriteLine("------------gov 方法 gov---------------"); // 獲的所有方法 MethodInfo[] m1 = t.GetMethods(); foreach (var method in m1) { Console.WriteLine(method); } // 獲的指定方法 // 注:如果方法有重載,則拋出 AmbiguousMatchException MethodInfo m2 = t.GetMethod("Say"); Console.WriteLine("\n"+m2); // 解決方法拋出 AmbiguousMatchException異常 m2 = t.GetMethod("Say",new Type[0]); // 獲取無(wú)參方法 m2 = t.GetMethod("Say",new Type[] { typeof(string)}); // 獲取參數(shù)為 string 得方法 Console.WriteLine("------------gov 屬性 gov---------------"); // 獲的屬性,獲取到得是封裝過(guò)得屬性 PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { Console.WriteLine(p); }}}

        輸出:

        Application.DogApplication.AnimalDogApplication.DogFalseFalseTrueFalseFalseFalse------------gov 構(gòu)造方法gov---------------Void.ctor()Void .ctor(System.String)Void .ctor(System.String, Int32)------------gov 字段gov---------------System.String nameSystem.Int32 ageSystem.Double priceSystem.Double<Price> k__BackingFieldSystem.Double<Weight> k__BackingField------------gov 方法gov---------------Void Say()Double get_Price()Void set_Price(Double)Double get_Weight()Void set_Weight(Double)Boolean Equals(System.Object)Int32 GetHashCode()System.Type GetType()System.String ToString()Void Say()------------gov 屬性gov---------------Double PriceDouble Weight反射示例 1

        class Dog{ public string name; public void Say() { Console.WriteLine("你好,"+Name); } public void Say(string name) { Console.WriteLine(#34;你好,{name}"); } public string Name { get; set; }}class Print{ // 反射示例 static void Main() { // 創(chuàng)建對(duì)象 Type t = typeof(Dog); object obj = Activator.CreateInstance(t); // 創(chuàng)建對(duì)象,調(diào)用無(wú)參構(gòu)造(方法1) object obj1 = t.GetConstructor(new Type[0]).Invoke(new object[0]); // 獲的對(duì)象得無(wú)參構(gòu)造,調(diào)用(方法2) // 給屬性賦值 PropertyInfo prop = t.GetProperty("Name"); // 獲的屬性 prop.SetValue(obj, "大寶"); // 賦值 // 調(diào)用方法 MethodInfo method = t.GetMethod("Say", new Type[0]); // 獲的無(wú)參方法 MethodInfo method1 = t.GetMethod("Say", new Type[] { typeof(string) }); // 獲的有參方法 method.Invoke(obj, new object[0]); // 調(diào)用無(wú)參方法 method1.Invoke(obj, new object[] { "Tom" }); // 調(diào)用有參方法并賦值 }}

        輸出:

        你好,大寶你好,Tom反射示例 2

        class Dog{ public string name; public void Say() { Console.WriteLine("你好,"+Name); } public void Say(string name) { Console.WriteLine(#34;你好,{name}"); } public string Name { get; set; }}class Print{ static void Main() { Dog dog = new Dog(); dog.Name = "Tom"; Show(dog); } static void Show(object obj) { Type t = obj.GetType(); PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { if (p.CanRead) { string name = p.Name; object value = p.GetValue(obj); Console.WriteLine(name+"="+value); } } }}

        輸出:

        Name=Tom反射示例3 (復(fù)制對(duì)象得值)(淺拷貝--僅復(fù)制對(duì)象得值,不是同一個(gè)對(duì)象)

        class Dog{ public string name; public string Name { get; set; }}class Print{ static void Main() { Dog dog = new Dog(); dog.Name = "Tom"; object dog1 = Clone(dog); Console.WriteLine(object.ReferenceEquals(dog,dog1)); // 判斷是否為同一個(gè)對(duì)象 } static object Clone(object obj) { Type t = obj.GetType(); object newObject = Activator.CreateInstance(t); // 創(chuàng)建對(duì)象 PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { if (p.CanRead&&p.CanWrite) { object value = p.GetValue(obj); p.SetValue(newObject, value); } } return newObject; }}

        輸出:

        False

         
        (文/江炫煌)
        打賞
        免責(zé)聲明
        本文為江炫煌推薦作品?作者: 江炫煌。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明原文出處:http://www.sneakeraddict.net/qzkx/show-109715.html 。本文僅代表作者個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

        粵ICP備16078936號(hào)

        微信

        關(guān)注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯(lián)系
        客服

        聯(lián)系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號(hào): weishitui

        客服001 客服002 客服003

        工作時(shí)間:

        周一至周五: 09:00 - 18:00

        台湾无码一区二区| 国产网红主播无码精品| 人妻少妇无码精品视频区 | 在线中文字幕播放| 亚洲精品无码乱码成人| 无码人妻一区二区三区精品视频| 中文字幕在线观看日本| 日韩亚洲AV无码一区二区不卡| √天堂中文官网在线| 亚洲va无码专区国产乱码| 日韩少妇无码一区二区三区 | 欧美乱人伦人妻中文字幕| 亚洲AV综合色区无码另类小说| 日韩va中文字幕无码电影| 亚洲伊人久久综合中文成人网 | 亚洲情XO亚洲色XO无码| 亚洲人成无码网WWW| 亚洲AV无码一区东京热| 亚洲视频中文字幕| 国产高清无码视频| 国产成年无码AV片在线韩国| 亚洲一级特黄无码片| 无码囯产精品一区二区免费| 熟妇人妻无乱码中文字幕真矢织江| 无码精品前田一区二区| 亚洲AV无码专区国产乱码电影 | 无码国产色欲XXXX视频| 最好看的中文字幕最经典的中文字幕视频| 久久Av无码精品人妻系列 | 蜜桃臀无码内射一区二区三区| 最新中文字幕在线观看| 中文字幕无码播放免费| 无码精品人妻一区二区三区免费看 | 无码精品一区二区三区免费视频| 国产精品99久久久精品无码| 国产精品 中文字幕 亚洲 欧美| 国产精品无码A∨精品影院 | 国产日韩AV免费无码一区二区三区| 精品欧洲AV无码一区二区男男| 波多野结衣在线中文| 中文字幕人妻色偷偷久久|