public class RefectionClass {
// 反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码
//一、反射的作用:
//动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型
//应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射
//反射主要应用於类库,这些类库需要知道一个类型的定义,以便提供更多的功能
//二、应用要点:
//现实应用程序中很少使用到反射
//使用反射动态邦定需要牺牲性能
//有些元数据信息是不能通过反射获取的
//某些反射类型是专门為那些CLR开发编辑器开发使用的,所以你要意思到不是所有反射类型都是可以使用的
//三、取得Assembly的方法:
//Assembly.Load
//Assembly.LoadFile
//Assembly.LoadFrom
//Type对象的Assembly方法
//四、反射的成员:
//MemberInfo-成员
//ConstructorInfo-结构
//FieldInfo-字段
//MethodInfo-方法
//PropertyInfo-属性
//EventInfo-事件
#region 通过反射获取创建类的实例
//Assembly对象的 CreateInstance方法
public static void Assembly_CreateInstance() {
string assmblyName = "AppTest";
string className = assmblyName + ".Member";
//获取当前命名控件下的程序集
Assembly assm = Assembly.Load(assmblyName);
//获取当前命名空间下的所有类
//Type[] typeArray = assm.GetTypes();
//if (typeArray == null || typeArray.Length == 0) {
// Console.WriteLine("命名空间为" + assmblyName + "下没有类");
//}
//foreach (Type type in typeArray) {
// Console.WriteLine("类名为:" + type.Name + ",FullName:" + type.FullName);
//}
//通过程序集创建实例 --无参
Member member = (Member)assm.CreateInstance(className);
Console.WriteLine("在加载程序集的时候创建无参实例:Name:" + member.Name + " ID:" + member.ID);
//忽略大小写创建实例
//Member member = (Member)assm.CreateInstance(className,true);
//根据程序集创建实例 --有参数
Object[] parameters = new Object[2];
parameters[0] = 10000;
parameters[1] = "Sanny";
//一定要注意每个参数含义
Member member1 = (Member)assm.CreateInstance(className, false, BindingFlags.Default, null, parameters, null, null);
Console.WriteLine("在加载程序集的时候创建有参数实例:Name:" + member1.Name + " ID:" + member1.ID);
Console.ReadLine();
}
//Activator对象的 CreateInstance方法
public static void Activator_CreateInstance() {
string assmblyName = "AppTest";
string className = assmblyName + ".Member";
//注意ObjectHandle含义
System.Runtime.Remoting.ObjectHandle entity = Activator.CreateInstance(assmblyName, className);
Member member = (Member)entity.Unwrap();
Console.WriteLine("Activator创建无参实例:Name:" + member.Name + " ID:" + member.ID);
Type type = Type.GetType(className);
//Member member1 = (Member)Activator.CreateInstance(type);
Object[] parameters = new Object[2];
parameters[0] = 10000;
parameters[1] = "Sanny";
System.Runtime.Remoting.ObjectHandle entity1 = Activator.CreateInstance(assmblyName, className, false, BindingFlags.Default, null, parameters, null, null);
Member member1 = (Member)entity1.Unwrap();
Console.WriteLine("Activator创建有参数实例:Name:" + member1.Name + " ID:" + member1.ID);
Console.ReadLine();
}
//使用Type的InvokeMember方法来取得对象的实例
public static void Type_InvokeMember() {
string assmblyName = "AppTest";
string className = assmblyName + ".Member";
Type type = Type.GetType(className);
if (type == null) {
Console.WriteLine("没有该类");
}
Member member = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
Console.WriteLine("InvokeMember创建无参数实例:Name:" + member.Name + " ID:" + member.ID);
Object[] parameters = new Object[2];
parameters[0] = 10000;
parameters[1] = "Sanny";
Member member1 = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, parameters);
Console.WriteLine("InvokeMember创建有参数实例:Name:" + member1.Name + " ID:" + member1.ID);
Console.ReadLine();
}
#endregion
#region 调用类的方法
//调用类的方法
public static void InvokeMemberMethodInfo() {
string assemblyName = "AppTest";
string className = assemblyName + ".Member";
Type type = Type.GetType(className);
if (type == null) {
Console.WriteLine("没有该类");
}
MethodInfo methodInfo = type.GetMethod("GetName");
//获取所有方法
// MemberInfo[] methodArray = type.GetMethods();
if (methodInfo == null) {
Console.WriteLine("没有该方法");
}
Member member = (Member)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
//Type对象的 InvokeMember方法
//MethodInfo对象的Invoke方法
var result = (string)methodInfo.Invoke(member, null);
// Type对象的 InvokeMember方法来动态调用方法
//var result = (string)type.InvokeMember("GetName", BindingFlags.InvokeMethod, null, member, null);
Console.WriteLine("通过Type来获取InvokeMember:Name:" + result );
Console.ReadLine();
}
#endregion
#region 反射获取类的字段信息
public static void Refection_FiedInfo() {
string assmblyName = "AppTest";
string className = assmblyName + ".Member";
Type type = Type.GetType(className);
if (type==null) {
return;
}
//在获取所有属性的时候,要注意添加方法参数,如果没有方法参数的话默认查询的是公共的字段
FieldInfo[] fieldArray=type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (FieldInfo filed in fieldArray) {
Console.WriteLine("字段名称为:"+filed.Name +" 字段类型:"+filed.FieldType);
}
Console.ReadLine();
}
#endregion
#region 反射获取类的属性信息
public static void Refection_PropertiesInfo() {
string assmblyName = "AppTest";
string className = assmblyName + ".Member";
Type type = Type.GetType(className);
if (type == null) {
return;
}
//在获取所有属性的时候,要注意添加方法参数,如果没有方法参数的话默认查询的是公共的字段
PropertyInfo[] propertiesArray = type.GetProperties(BindingFlags.Public|BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (PropertyInfo property in propertiesArray) {
Console.WriteLine("属性名称为:" + property.Name + " 属性类型:" + property.PropertyType);
}
Console.ReadLine();
}
#endregion
}
//--------------------------------------------------------------------------------
//以上所使用的AppTest.Member為:
//新建一个AppTest类库,在其下建立一个Member的类
public class Member {
private int _id = 1;
public int ID {
get { return _id; }
set { _id = value; }
}
private string _name = "Tom";
public string Name {
get { return _name; }
set { _name = value; }
}
public Member() { }
public Member(int id, string name) {
_id = id;
_name = name;
}
public string GetName() {
return _name;
}
}
参考: