文章
前言
C#反射机制广泛应用于插件开发中,可以在程序编译后获得信息,非常灵活。
一、加载DLL文件
二、实例化对象
//加载DLL
Assembly assembly1 = Assembly.Load("reflection");//方法一:将加载的DLL放入项目执行目录下 方法参数不需要.dll后缀。
Assembly assembly2 = Assembly.LoadFile("D:\\练习\\VS\\C#\\ReflectionDemo\\ReflectionDemo\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
Assembly assembly3 = Assembly.LoadFrom("D:\\练习\\VS\\C#\\ReflectionDemo\\ReflectionDemo\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
//获取指定类型,并且实例化
Type type = assembly3.GetType("reflection.reflectionTest");
object obj= Activator.CreateInstance(type);//动态实例化 调用了参数构造函数
object obj2 = Activator.CreateInstance(type,new object[] {"李华"});//动态实例化,调用有参构造函数
Console.ReadKey();
运行结果
三.获取DLL中所有类,构造方法,构造方法参数
代码如下:
//加载DLL
Assembly assembly1 = Assembly.Load("reflection");//方法一:将加载的DLL放入项目执行目录下 方法参数不需要.dll后缀。
Assembly assembly2 = Assembly.LoadFile("D:\\练习\\VS\\C#\\ReflectionDemo\\ReflectionDemo\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
Assembly assembly3 = Assembly.LoadFrom("D:\\练习\\VS\\C#\\ReflectionDemo\\reflection\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
//获取指定类型,并且实例化
Type type = assembly3.GetType("reflection.reflectionTest");
foreach (var item in assembly3.GetTypes())//获取所有类
{
Console.WriteLine("类名"+item.Name);
}
foreach (var item in type.GetConstructors())//获取所有构造方法
{
Console.WriteLine($"{item.Name}");
foreach (var item2 in item.GetParameters())//获取所有所有构造方法参数
{
Console.WriteLine($"构造方法的参数:{item2.ParameterType}");
}
}
j结果示例:
四.调用泛型方法
DLL内容:
代码如下:
static void Main(string[] args)
{
//加载DLL
Assembly assembly1 = Assembly.Load("reflection");//方法一:将加载的DLL放入项目执行目录下 方法参数不需要.dll后缀。
Assembly assembly2 = Assembly.LoadFile("D:\\练习\\VS\\C#\\ReflectionDemo\\ReflectionDemo\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
Assembly assembly3 = Assembly.LoadFrom("D:\\练习\\VS\\C#\\ReflectionDemo\\reflection\\bin\\Debug\\reflection.dll");//方法二:DLL路径+扩展名。
//获取指定类型,并且实例化
Type type = assembly3.GetType("reflection.reflectionTest");
foreach (var item in assembly3.GetTypes())//获取所有类
{
Console.WriteLine("类名"+item.Name);
}
foreach (var item in type.GetConstructors())//获取所有构造方法
{
Console.WriteLine($"{item.Name}");
foreach (var item2 in item.GetParameters())//获取所有所有构造方法参数
{
Console.WriteLine($"构造方法的参数:{item2.ParameterType}");
}
}
object obj= Activator.CreateInstance(type);//动态实例化 调用了参数构造函数
// object obj3 = Activator.CreateInstance(type,true);
object obj2 = Activator.CreateInstance(type,new object[] {"李华"});//动态实例化,调用有参构造函数
MethodInfo methodInfo = type.GetMethod("pubmethod");//按照方法名获取方法
methodInfo.Invoke(obj2, new object[] { });//执行方法
///泛型方法的调用无参数
var method3 = type.GetMethod("test1");//查找指定方法
var genericMethod3=method3.MakeGenericMethod(new Type[] {typeof(object)});//指定泛型参数类型
genericMethod3.Invoke(obj2, new object[] { });
///泛型方法的调用有参数
var method4 = type.GetMethod("test2");//查找指定方法
var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(object) });//指定泛型参数类型
genericMethod4.Invoke(obj2, new object[] {"你","好" });
Console.ReadKey();
}
}
运行结果:
总结
加载DLL,实例化对象,获取DLL中所有类,构造方法,构造方法参数,调用泛型方法。