1、定义
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。
有了反射,即可了解类型,还可以创建实例对象,调用类型中的方法等。
2、命名空间
反射用到的命名空间:
System.Reflection
3、常用的类
1)Assembly:加载程序集
2)ConstructorInfo:了解构造函数相关的信息
3)MethodInfo:了解方法相关的信息
4)ParameterInfo:了解参数相关信息
5)FildInfo:了解字段相关信息
6)EventInfo:了解事件相关信息
7)PropertyInfo了解属性相关信息
4、常用类型及方法总结
Assembly:加载程序集
方式一:动态库名
Assembly assembly = Assembly.Load(“Cities”)
方式二:动态库路径
string dllPath = @“F:\RevitProject\Cities\Cities\bin\Debug\Cities.dll”;
Assembly assembly = Assembly.LoadFrom(dllPath);
加载完程序集,接下来可以了解程序集中包含的类型信息
Type[] types = assembly.GetTypes();
assembly.GetType(typeName);//注意使用类的全名,即包含命名空间的类名
取得了所需的类型,接下来可以创建类型实例,有两种方式;
方式一:
object obj = Activator.CreateInstance(type,null);//其中参数1是类型,参数二是构造函数所需参数
方式二:通过得到构造方法,来创建对象
ConstructorInfo ci = t.GetConstructor(pt); //根据参数类型获取构造函数
object[] paras = new object[2]{“Hello”,“World”}; //构造Object数组,作为构造函数的输入参数 构造函数有两个string类型的参数
object o = ci.Invoke(paras); //调用构造函数生成对象
((NewClassw)o).show(); //调用实例对象的show方法
取得类型所包含的方法,有两种方法
MethodInfo method = type.GetMethod(“DelicousFood”);//已经方法名称
MethodInfo[] methods = type.GetMethods();//可以遍历方法
方法的调用:
无参方法的调用:
method.Invoke(obj,null);
有参数方法的调用:
object[] paras = new object[2] { “Yantai”,32};
method2.Invoke(obj,paras);
下面是我的一个简单测试:
首先创建了一个 一个类库项目:目的生成.dll文件
代码如下:
创建Workor.cs
public abstract class Workor
{
public abstract void Work();
}
创建Doctor.cs
public class Doctor : Workor
{
string name;
public Doctor()
{
name = "Doctor";
Console.WriteLine("构造函数被调用");
}
public override void Work()
{
Console.WriteLine("Job is " + name);
}
public void Infor(string add,int age)
{
Console.WriteLine( name + "住在 " + add + ",年龄" + age);
}
}
编译生成动态库文件
新建控制台应用程序
using System;
using System.Reflection;
namespace AssemblyDemo
{
class Program
{
static void Main(string[] args)
{
try
{
//测试以动态库文件路径的方式,加载动态库文件
string dllPath = @"F:\RevitProject\LibararyDemo\LibararyDemo\bin\Debug\LibararyDemo.dll";
Assembly ass = Assembly.LoadFrom(dllPath);
/*
Type[] types = ass.GetTypes();
Console.WriteLine(types.Count().ToString());
*/
Type type = ass.GetType("LibararyDemo.Doctor");
Console.WriteLine(type.Name);
//创建类型对象
object obj = Activator.CreateInstance(type, null);
//取得类型中的方法,调用不含参数的方法
MethodInfo method = type.GetMethod("Work");
method.Invoke(obj,null);
//调用含参的方法
MethodInfo method2 = type.GetMethod("Infor");
object[] paras = new object[2] { "Yantai",32};
method2.Invoke(obj,paras);
}
catch (Exception excption)
{
Console.WriteLine("Excption:" + excption.Message);
}
}
}
}