c#之反射

来源:互联网 发布:二次元人物制作软件 编辑:程序博客网 时间:2024/05/16 08:46

最近突然想研究一下反射,学习了网上各位前辈的文章,分享一下自己的学习笔记吧,水平有限有错误希望指出来;

`using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 反射
{
public class RefClass
{
private int _Met01 =4;
private int _Met02=3;
public int Test3 { set { _Met01 = value; } get { return _Met01; } }
private int Test2 { set { _Met02 = value; } get { return _Met02; } }
string name = “likang”;

    public void Show()    {        Console.WriteLine(_Met02);    }    public RefClass()    {    }}public class TestClass{    private string name = "king";    public string Name { get { return name; }  }}class Program{    static void Main(string[] args)    {       RefClass re = new RefClass();       Type t = re.GetType();//Type类对于反射是非常重要的,Type有与每种数据类型对应的派生类,使用这个派生类                            //的对象的方法、字段、属性来查找有关该类型的所有信息;       //ConstructorInfo[] ci = t.GetConstructors(); //得到该类所有的构造函数       //foreach (ConstructorInfo item in ci)       //{       //    ParameterInfo[] ps = item.GetParameters(); //取出每个构造函数的所有参数       //    foreach (ParameterInfo p in ps)       //    {       //        Console.WriteLine(p.ParameterType.ToString());       //    }       //}     //  PropertyInfo[] pp = t.GetProperties();//不带参数的方法只能获取公开的属性    //   PropertyInfo[] pif = t.GetProperties(BindingFlags.NonPublic| BindingFlags.Public| BindingFlags.Instance);//获取公开属性和私有属性     //  foreach (PropertyInfo item in pif)    //   {     //        Console.WriteLine(item.Name);     //  }       TestClass tc = new TestClass();       Console.WriteLine(tc.Name);       var a = tc.GetType().GetField("name",BindingFlags.Instance|BindingFlags.GetField| BindingFlags.NonPublic| BindingFlags.ExactBinding);       a.SetValue(tc,"queen");       Console.WriteLine(tc.Name); //通过反射改变了私有变量的值        Console.ReadKey();    }}

}
`有几个标志性的类和方法介绍一下:
ConstructorInfo 构造函数的名称、参数、访问修饰符等信息皆可以反射获取;
MethodInfo 方法的名称、返回类型,参数,访问修饰符等信息可以反射获取;
FieldInfo 字段的名称,范文修饰符,并且可以获取设置字段值;
EventInfo 事件的名称、事件处理数据类型,添加或者移除事件处理;
PropertyInfo 属性的名称、数据类型、读写状态,获取和设置属性值;
ParameterInfo 参数的名称、数据类型。输入参数或输出参数;

这里写图片描述