------- Java培训、Android培训、iOS培训、.Net培训 、期待与您交流! -------
刚开始接触反射的童鞋往往会惊叹这种神奇的功能,其实反射没有那么高大上,就是由几个特殊的类组成体系而已,下面慢慢道来
1. 什么是反射
.Net的应用程序由都是由程序集组成,程序集又由模块组成,模块又由类型组成。反射是在运行时获取程序集信息,模块信息,类信息的一种技术(这些信息一般称为元数据)。这在本质上与读取磁盘文件没有区别。这次读取的时程序集的文件而已,并把读取到的信息存放在几个特别的类中。
2,相关类的介绍
Assembly类:是用于存储程序集的信息,它提供的方法,还可以动态将程序集加载到内存实例。
Type类:用于存放类型信息,初学的童鞋往往对这个类会感到迷惑,举个例子,他可以存放int类型,有几个方法,几个属性,各自的访问控制信息等;他甚至可以存放自己类型的相关信息
MethodInfo类:在Type类型中,他是使用MethodInfo类来存放相关类型的方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
类似的还有FieldInfo、PropertyInfo、ConstructorInfo、EventInfo等,童鞋看名字也应该代表的含义了吧
3,玩玩反射
(1)获取当前都程序加载了什么程序集(单应用程序域)//应用程序域的概念是另外一个大的主题,感兴趣的童鞋请自己查想关资料。
foreach (Assembly assem in AppDomain.currentDomain.GetAssemblies())
{ 。。。}
调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。
(2)获取类型信息(这个厉害哦,不用new,手动输入任意类型的名字,就可以实例化相应的类型,这也是大多童鞋对反射惊叹的原因,其实这只是反射技术的一个很小的应用而已)
class Project
{
static void Main(string[]args)
{
Project rf=new Project();
assembly myAssembly =assembly.loadfrom(“rf.exe”) //可以动态加载程序集哦。
Project.getreflectioninfo(myAssembly);
}
void getreflectioninfo(assembly myassembly) //懂点E问的小盆友都应该明白什么意思,我就不注释了哈
{
type[] typearr=myassemby.Gettypes();
foreach (type type in typearr)
{
constructorinfo[] myconstructors=type.GetConstructors;
fieldinfo[] myfields=type.GetFiedls()
MethodInfo myMethodInfo=type.GetMethods();
propertyInfo[] myproperties=type.GetProperties
EventInfo[] Myevents=type.GetEvents;
}
}
}
using System;
using System.Reflection;
namespace Console
{
class LO
{
public int field1;private string _name;
public LO() {}
public string Name {
get { return _name; }
set { _name=value; }
}
public int GetInt(int a) {return a;}
public void Display(string str)
{
Console.WriteLine(str);}
}
class Class1
{
static void Main(string[] args)
{
Love love = new Love();Type type = love.GetType();
Object obj = type.InvokeMember
(
null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args
);
type.InvokeMember("Display",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance , null , obj , new object[]{"aldfjdlf"});int i = (int)type.InvokeMember("GetInt",BindingFlags.InvokeMethod | BindingFlags.Public |BindingFlags.Instance,null,obj,new object[]{1});
Console.WriteLine(i);
type.InvokeMember("Name",BindingFlags.SetProperty,null,obj,new string[]{"abc"});
string str=(string)type.InvokeMember("Name",BindingFlags.GetProperty,null,obj,null);
Console.WriteLine(str);
type.InvokeMember("field1",BindingFlags.SetField,null,obj,new object[]{444});
int f=(int)type.InvokeMember("field1",BindingFlags.GetField,null,obj,null);
Console.WriteLine(f);
Console.ReadLine();
}
}
}