反射
来源http://www.cnblogs.com/yaozhenfa/p/CSharp_Reflection_1.html
使用反射的一种思路:面向接口编程中,一个方法要兼容多个数据库链接,不知道可以使用哪一种数据库,所以数据库操作类是未知的,这时就可以通过反射获取操作类信息,进行判断是属于那一类的数据库,做出相应的措施。
自己的代码实践:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net; 10 using System.Net.Sockets; 11 using System.Reflection; 12 13 namespace WindowsFormsApplication1 14 { 15 //测试类 16 public class TestClass 17 { 18 // 共有/私有/受保护的字段 19 // 属性和字段区别:属性可以存储数据 20 //get set 其实就是方法 21 public int publicT1 { get; set; } 22 private int privateT2 { get; set; } 23 protected int protectedT3 { get; set; } 24 public int T4 = 1; 25 //公有/私有/受保护的方法 26 public void publicShow() { } 27 private void privateShow() { } 28 protected void protectedShow() { } 29 //静态方法 30 public static void StaticF() 31 { 32 33 } 34 35 } 36 public partial class Form1 : Form 37 { 38 /** 39 * 目的:学习反射 40 * 1.创建一个类:有公共/私有/受保护的字段和方法 41 * 2.通过学习反射获取改类的内部信息 42 * 3.在窗口中程序中进行测试,用label控件反馈内容 43 * 步骤: 44 * 1.前期准备 45 * 2.窥视内部 46 * 3.深入窥视字段 47 * 4.深入窥视属性 48 * 5.深入窥视方法 49 */ 50 public Form1() 51 { 52 InitializeComponent(); 53 } 54 //测试的前提假设:TestClass类是一个我们不知道的类 55 private void Form1_Load(object sender, EventArgs e) 56 { 57 58 //label1.Text = Easy(); 59 //label1.Text = Easy2(); 60 //label1.Text = Easy3(); 61 //label1.Text = Easy4(); 62 //label1.Text = Field(); 63 //label1.Text = Properties(); 64 label1.Text = Method(); 65 66 } 67 //简单方法:窥视内部,可以获取公共的属性和方法,除了静态成员,包含基类属性和方法。 68 string Easy() 69 { 70 string str = ""; 71 //Type:表示类型声明。告诉系统,这是一个类 72 Type t = typeof(TestClass); 73 //MemberInfo:封装成员信息,并提供对其元数据的访问,的数组。 74 MemberInfo[] m = t.GetMembers(); 75 foreach(MemberInfo mb in m) 76 { 77 str += mb.Name +"\r\n"; 78 } 79 return str; 80 } 81 //简单方法2:窥视内部,通过重载GetMembers()方法,可以获取所有的的属性和方法,除了静态成员,包含基类属性和方法。 82 string Easy2() 83 { 84 string str = ""; 85 Type t = typeof(TestClass); 86 //传入了枚举类型,分别是“包含公开”、“包含非公开”、“包含实例成员”。然后我们就可以获取到所有成员了。 87 //BindingFlags这个枚举可以告诉GetMembers方法你需要返回什么内容。 88 MemberInfo[] m = t.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 89 foreach (MemberInfo mb in m) 90 { 91 str += mb.Name + "\r\n"; 92 } 93 return str; 94 } 95 //简单方法3:窥视内部,通过重载GetMembers()方法,可以获取所有的的属性和方法,除了静态成员,不包含基类属性和方法。 96 string Easy3() 97 { 98 string str = ""; 99 Type t = typeof(TestClass); 100 //只需要新加上一个枚举类型BindingFlags.DeclaredOnly 101 MemberInfo[] m = t.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); 102 foreach (MemberInfo mb in m) 103 { 104 str += mb.Name + "\r\n"; 105 } 106 return str; 107 } 108 //简单方法4:窥视内部,通过重载GetMembers()方法,可以获取所有的的属性和方法,包含静态成员,不包含基类属性和方法。 109 string Easy4() 110 { 111 //Lambda表达式,Func是有返回值的泛型委托,是一个匿名函数:Func<参数类型,返回值类型> getType = (形参列表) => 函数体 112 //意思就是:创建一个委托,里面存储一个匿名函数,通过调用该委托实现方法的使用。 113 //达到的效果是:方法中定义方法,然后调用 114 Func<MemberTypes, string> getType = (x) => 115 { 116 switch (x) 117 { 118 case MemberTypes.Field: 119 return "字段"; 120 case MemberTypes.Method: 121 return "方法"; 122 case MemberTypes.Property: 123 return "属性"; 124 default: 125 return "未知"; 126 } 127 }; 128 string str = ""; 129 Type t = typeof(TestClass); 130 //只需要新加上一个枚举类型BindingFlags.Static 131 MemberInfo[] m = t.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly |BindingFlags.Static); 132 foreach (MemberInfo mb in m) 133 { 134 str += mb.Name + ",类型:" 135 + getType(mb.MemberType) //调用委托,启用匿名方法 136 + "\r\n"; 137 } 138 return str; 139 } 140 //字段方法:深入窥视字段,不再全部获取,单单获取字段 141 string Field() 142 { 143 string str = ""; 144 Type t = typeof(TestClass); 145 //FieldInfo封装字段信息 146 FieldInfo[] f = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly ); 147 foreach (FieldInfo fi in f) 148 { 149 str += fi.Name 150 + "\r\n"; 151 } 152 return str; 153 } 154 //属性方法:深入窥视属性,单单获取属性 155 string Properties() 156 { 157 string str = ""; 158 Type t = typeof(TestClass); 159 //FieldInfo封装字段信息 160 PropertyInfo[] f = t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); 161 foreach (PropertyInfo fi in f) 162 { 163 str += fi.Name 164 + "\r\n"; 165 } 166 return str; 167 } 168 //函数方法:深入窥视方法,单单获取方法 169 string Method() 170 { 171 string str = ""; 172 Type t = typeof(TestClass); 173 //FieldInfo封装字段信息 174 MethodInfo[] f = t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); 175 foreach (MethodInfo fi in f) 176 { 177 str += fi.Name 178 + "\r\n"; 179 } 180 return str; 181 } 182 } 183 184 }
社会中的尘埃,随风而动而已