zoukankan      html  css  js  c++  java
  • 反射

    来源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 +"
    ";
     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 + "
    ";
     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 + "
    ";
    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                     + "
    "; 
    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                     + "
    ";
    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                     + "
    ";
    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                     + "
    ";
    179             }
    180             return str;
    181         }
    182     }
    183     
    184 }
  • 相关阅读:
    数据结构
    类加载器介绍
    算法复杂度
    PHP代码审计分段讲解(5)
    PHP代码审计分段讲解(4)
    SQLMap使用指北
    PHP代码审计分段讲解(3)
    PHP代码审计分段讲解(1)
    Nmap学习使用指南
    Python Flask后端异步处理(三)
  • 原文地址:https://www.cnblogs.com/it-xcn/p/6092476.html
Copyright © 2011-2022 走看看