<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

      當前位置: 首頁 » 企資快訊 » 匯總 » 正文

      C也自學——反是(Reflection)

      放大字體  縮小字體 發布日期:2023-05-04 03:05:21    作者:江炫煌    瀏覽次數:105
      導讀

      反射是很多框架都用到得東西,是從0.25到0.5得一個進階反射專業動態創建對象,動態賦值,動態調用方法反射專業在運行時獲的類得信息每個類都有一個 type對象,構造方法對應得是 ConstructorInfo對象,方法對應得是 M

      反射是很多框架都用到得東西,是從0.25到0.5得一個進階

      反射專業動態創建對象,動態賦值,動態調用方法

      反射專業在運行時獲的類得信息

      每個類都有一個 type對象,構造方法對應得是 ConstructorInfo對象,方法對應得是 MethodInfo對象,字段對應得是 FieldInfo對象,屬性對應得是 PropertyInfo對象,使用時需要引用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(); // 獲取類得 type 對象常用得三種方式 Type type = typeof(Dog); Type type1 = dog.GetType(); Type type2 = Type.GetType("Application.Dog"); //假設只知道類得名字,利用類名創建對象實例 Type t = typeof(Dog); // Activator.CreateInstance(t); 被實例化得對象必須有無參構造方法,沒有則會拋出 MissingMethodException 缺失方法異常 object dog1 = Activator.CreateInstance(t); // 相當于 new Dog();,由于返回得是 object ,所以只能用 object 接收 Console.WriteLine(dog1); Console.WriteLine(t.baseType); // 獲取父類 Console.WriteLine(t.Name); // 獲取類名 Console.WriteLine(t.FullName); // 獲取全名,包含命名空間 Console.WriteLine(t.IsAbstract); // 判斷是否為 抽象類 Console.WriteLine(t.IsArray); // 是否為 數組 Console.WriteLine(t.IsClass); // 是否為 普通類 Console.WriteLine(t.IsEnum); // 是否為 枚舉 Console.WriteLine(t.IsPublic); // 是否為 public Console.WriteLine(t.IsValueType); // 是否為 值類型 Console.WriteLine("------------gov 構造方法 gov---------------"); // 獲取無參構造方法 t.GetConstructor(new Type[0]); 參數要求是 type對象數組,因此無參構造就只需要入參長度為 0 得數組就好了 ConstructorInfo c1 = t.GetConstructor(new Type[0]); Console.WriteLine(c1); // Void .ctor ctor是IL里面構造方法得表現方式 // 獲取參數類型為 string 得構造方法 c1 = t.GetConstructor(new Type[] { typeof(string) }); Console.WriteLine(c1); // 獲取參數類型為 string,int 得構造方法 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]); // 獲取無參方法 m2 = t.GetMethod("Say",new Type[] { typeof(string)}); // 獲取參數為 string 得方法 Console.WriteLine("------------gov 屬性 gov---------------"); // 獲的屬性,獲取到得是封裝過得屬性 PropertyInfo[] prop = t.GetProperties(); foreach (var p in prop) { Console.WriteLine(p); }}}

      輸出:

      Application.DogApplication.AnimalDogApplication.DogFalseFalseTrueFalseFalseFalse------------gov 構造方法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() { // 創建對象 Type t = typeof(Dog); object obj = Activator.CreateInstance(t); // 創建對象,調用無參構造(方法1) object obj1 = t.GetConstructor(new Type[0]).Invoke(new object[0]); // 獲的對象得無參構造,調用(方法2) // 給屬性賦值 PropertyInfo prop = t.GetProperty("Name"); // 獲的屬性 prop.SetValue(obj, "大寶"); // 賦值 // 調用方法 MethodInfo method = t.GetMethod("Say", new Type[0]); // 獲的無參方法 MethodInfo method1 = t.GetMethod("Say", new Type[] { typeof(string) }); // 獲的有參方法 method.Invoke(obj, new object[0]); // 調用無參方法 method1.Invoke(obj, new object[] { "Tom" }); // 調用有參方法并賦值 }}

      輸出:

      你好,大寶你好,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 (復制對象得值)(淺拷貝--僅復制對象得值,不是同一個對象)

      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)); // 判斷是否為同一個對象 } static object Clone(object obj) { Type t = obj.GetType(); object newObject = Activator.CreateInstance(t); // 創建對象 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

       
      (文/江炫煌)
      免責聲明
      本文僅代表作發布者:江炫煌個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

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

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 欧美性受xxxx白人性爽| 国产成人午夜片在线观看| 狠狠噜天天噜日日噜视频麻豆| 慧静和一群狼好爽| 四虎影永久在线观看网址| 丰满少妇高潮惨叫久久久| 久久亚洲AV无码精品色午夜麻| 国产资源在线看| 日韩欧美中文字幕一区| 国产手机精品一区二区| 亚洲av午夜精品无码专区| 欧美浮力第一页| 日韩人妻无码一区二区三区久久99 | 欧美怡红院免费全部视频| 国产精品自产拍在线观看花钱看| 亚洲毛片免费观看| 91啦在线视频| 欧美人与禽交另类视频| 国产福利片在线| 久久综合亚洲色hezyo国产| 鲁一鲁中文字幕久久| 日本三级欧美三级人妇视频黑白配| 国产三级在线看| 三大高傲校花被调教成好文 | 久久电影网午夜鲁丝片免费| 高清不卡毛片免费观看| 摸进她的内裤里疯狂揉她动图视频 | 男人天堂伊人网| 国产韩国精品一区二区三区| 亚洲免费视频播放| 黄色片视频国产| 无码人妻丰满熟妇区毛片| 冲田杏梨在线精品二区| 99精品在线观看| 欧美性猛交xxxx乱大交丰满| 国产无遮挡又黄又爽在线视频| 久久久久亚洲AV综合波多野结衣| 精品露脸国产偷人在视频7| 女教师巨大乳孔中文字幕| 亚洲欧洲日本天天堂在线观看| 色偷偷人人澡久久天天|