using System.Reflection;//引用System.Reflection命名空间
using System;//引用System命名空间
public class ReflectionTest
{
private Assembly assembly;//声明一个程序集
void Main()
{
#region 第1步:获取程序集
//通过文件加载dll给程序集
assembly = Assembly.LoadFile("C:/Users/Njiyue/Desktop/Test.dll");
#endregion
#region 第2步:通过程序集获取一个Type
//通过Assembly的“GetType”函数,传入(命名空间.类)来获取某类型
Type classType = assembly.GetType("nameSpace.Class");
#endregion
//————————————————获取到Type之后,接下来就仅仅是对Type进行操作了
//————————————————可以重点学习一下Type类的使用
#region 第3步:对这个Type进行操作,可以获取Type的属性、字段,执行Type中的函数等
//通过Type的“GetProperty”函数获取类中的属性,
//传入 “BindingFlags.Static、BindingFlags.Instance、 BindingFlags.Public、BindingFlags.NonPublic”参数
//表示“静态、实例、公开、不公开”的属性
PropertyInfo propertyInfo = classType.GetProperty("propertyName", BindingFlags.Instance | BindingFlags.Public);
//PropertyInfo.GetValue(),传入一个实例对象,来获取这个实例对象的属性值
propertyInfo.GetValue(new object());
//PropertyInfo.SetValue(),传入一个实例对象和要修改的值,来设置这个实例对象的属性值
propertyInfo.SetValue(new object(), new object());
//通过Type的“GetField”函数获取类中的字段
FieldInfo fieldInfo = classType.GetField("fieldName", BindingFlags.Instance | BindingFlags.NonPublic);
//获取值和赋值方法与属性一致
fieldInfo.GetValue(new object());
fieldInfo.SetValue(new object(), new object());
//通过Type的“GetMethod”函数获取类中的函数
//传入 “BindingFlags.Static、BindingFlags.Instance、 BindingFlags.Public、BindingFlags.NonPublic”参数
//表示“静态、实例、公开、不公开”的函数
MethodInfo methodInfo = classType.GetMethod("MethodName", BindingFlags.Static | BindingFlags.Public);
//使用MethodInfo.Invoke()来执行方法
//public object Invoke(object obj, object[] parameters);
//方法第一个参数是一个实例对象,如果是静态函数,就填null,第二个参数是这个函数需要传入的参数
//使用as关键字将函数的返回值转为指定类型
object returnObj = methodInfo.Invoke(null, null) as object;
//使用 Delegate CreateDelegate(Type type, object firstArgument, MethodInfo method); 可以根据MethodInfo创建一个委托
Func<float> fun = (Func<float>)Delegate.CreateDelegate(typeof(Func<float>), new object(), methodInfo);
fun();
#endregion
}
}
个人笔记 仅供参考 欢迎指正