一、引入命名空間:System.Reflection;程序集:mscorlib(在mscorlib.dll中)數組
二、示例代碼(主要是getType()、setValue()、getValue()方法):spa
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Reflection; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace 反射 9 { 10 class Program 11 { 12 /// <summary> 13 /// 反射描述了程序集、模塊、類型的對象(Type類型)。能夠使用反射動態建立類型的實例,將實例綁定到現有對象,或從現有對象獲取類型並調用其方法或訪問其字段和屬性 14 /// 若是代碼中使用了特性,能夠利用反射來訪問它們 15 /// </summary> 16 static void Main(string[] args) 17 { 18 19 //一、GetType()的解釋及示例 20 // 21 // 摘要: 22 // 獲取當前實例的 System.Type。 23 // 24 // 返回結果: 25 // System.Type 實例,表示當前實例的確切運行時類型。 26 27 //下面使用靜態方法GetType(從Object基類派生的全部類型都繼承該方法)獲取其類型的簡單反射示例 28 Student stu1 = new Student() { id = 1, name = "張三", length = 175, datetime = DateTime.Now };// 29 Student stu2 = new Student() { id = 2, name = "李四", length = 180, datetime = DateTime.Now };//name = "李四", datetime = DateTime.Now 30 31 var list = new List<Student>(); 32 list.Add(stu1); 33 list.Add(stu2); 34 35 Type stuType = stu1.GetType(); 36 Type listType = list.GetType(); 37 38 Console.WriteLine("---------------getType()輸出類型----------------"); 39 Console.WriteLine(stuType);//輸出Student的類型 40 Console.WriteLine(stu1.id.GetType());//輸出Student的id的類型 41 Console.WriteLine(stu1.name.GetType());//輸出Student的name的類型 42 Console.WriteLine(stu1.datetime.GetType());//輸出Student的datetime的類型 43 44 Console.WriteLine(listType);//輸出List的類型 45 46 47 //二、GetProperties()的解釋及示例 48 // 49 // 摘要: 50 // 返回當前 System.Type 的全部公共屬性。 51 // 52 // 返回結果: 53 // 表示當前 System.Type 的全部公共屬性的 System.Reflection.PropertyInfo 對象數組。- 或 -若是當前 System.Type 54 // 沒有公共屬性,則爲 System.Reflection.PropertyInfo 類型的空數組。 55 56 PropertyInfo[] stuPropertyS = stuType.GetProperties(); 57 PropertyInfo[] listPropertyS = listType.GetProperties(); 58 59 //Console.WriteLine(stuPropertyS.Count()); 60 //Console.WriteLine(stuPropertyS.Length); 61 62 //三、SetValue()的解釋及示例 63 // 64 // 摘要: 65 // 用索引屬性的可選索引值設置該屬性的值。 66 // 67 // 參數: 68 // obj: 69 // 將設置其屬性值的對象。 70 // 71 // value: 72 // 此屬性的新值。 73 // 74 // index: 75 // 索引化屬性的可選索引值。對於非索引化屬性,此值應爲 null。 76 // 77 // 異常: 78 // System.ArgumentException: 79 // index 數組不包含所需類型的參數。- 或 -未找到該屬性的 set 訪問器。 80 // 81 // System.Reflection.TargetException: 82 // 該對象與目標類型不匹配,或者某屬性是實例屬性但 obj 爲 null。 83 // 84 // System.Reflection.TargetParameterCountException: 85 // index 中參數的數目與已編制索引的屬性所採用的參數的數目不相符。 86 // 87 // System.MethodAccessException: 88 // 嘗試非法訪問某類中私有或受保護的方法。 89 // 90 // System.Reflection.TargetInvocationException: 91 // 設置屬性值時出錯。例如,爲索引屬性指定的索引值超出範圍。System.Exception.InnerException 屬性指示錯誤的緣由。 92 Console.WriteLine("---------------setValue()給某屬性賦值----------------"); 93 PropertyInfo stuPro = stuPropertyS.FirstOrDefault(x => x.Name == "name");//這裏是找name的屬性名 94 stuPro.SetValue(stu1, "王五", null); 95 Console.WriteLine(stu1.name); 96 97 98 //四、GetType()方法的解釋和示例 99 // 100 // 摘要: 101 // 用索引化屬性的可選索引值返回指定對象的該屬性值。 102 // 103 // 參數: 104 // obj: 105 // 將返回其屬性值的對象。 106 // 107 // index: 108 // 索引化屬性的可選索引值。 對於非索引化屬性,該值應爲 null。 109 // 110 // 返回結果: 111 // 指定對象的屬性值。 112 // 113 // 異常: 114 // System.ArgumentException: 115 // index 數組不包含所需類型的參數。 - 或 - 未找到該屬性的 get 訪問器。 116 // 117 // System.Reflection.TargetException: 118 // 該對象與目標類型不匹配,或者某屬性是實例屬性但 obj 爲 null。 119 // 120 // System.Reflection.TargetParameterCountException: 121 // index 中參數的數目與已編制索引的屬性所採用的參數的數目不相符。 122 // 123 // System.MethodAccessException: 124 // 嘗試非法訪問某類中私有或受保護的方法。 125 // 126 // System.Reflection.TargetInvocationException: 127 // 檢索屬性值時出錯。 例如,爲索引屬性指定的索引值超出範圍。 System.Exception.InnerException 屬性指示錯誤的緣由。 128 Console.WriteLine("---------------getValue()遍歷屬性值----------------"); 129 foreach (var v in stuPropertyS)//遍歷屬性 130 { 131 Console.WriteLine(v.GetValue(stu1, null)); 132 } 133 134 135 Console.ReadLine(); 136 } 137 } 138 139 public class Student 140 { 141 public int id { get; set; } 142 public string name { get; set; } 143 public decimal length { get; set; } 144 public DateTime datetime { get; set; } 145 } 146 }
三、運行結果:code
四、下面是PropertyInfo 類型主要公開的成員,可供參考(摘自:http://msdn.microsoft.com/zh-cn/library/system.reflection.propertyinfo(v=vs.110).aspx)對象