反射

来源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 }

 

posted @ 2016-11-23 09:35  黑色鼠标  阅读(208)  评论(0编辑  收藏  举报