反射的应用笔记
程序员文章站
2022-07-13 23:45:04
...
Console.WriteLine("Hello World!");
/*
1.反射:来自于System.Reflection.是一个帮助类库 可以读取dll/exe中metadata和使用metadata+动态的创建dll/exe
2.
*/
//反射
//1.动态读取Dll
Assembly assembly = Assembly.LoadFrom(""); //dll名称
//assembly.GetTypes();//获取到类型
//assembly.GetFiles();//获取程序清单
//assembly.GetName(); //获取方法
//1.获取到具体的类型
Type type = assembly.GetType();
//2.创建对象
//1.
//object? oInstance = Activator.CreateInstance(type);
//2.
//如果使用dynamic关键字声明对象,调用的时候没有限制 dynamic:动态类型,运行时决定类型
//dynamic dInstance = Activator.CreateInstance(type);
//dInstance.方法();
//3.类型转换
//如果类型一致,就可以转换,如果不一致就返回null
//反射的类 helper = oInstance as 反射的类;
//4.调用方法
//helper.方法();
//2.反射黑科技---反射可以做到普通方式做不到的事情 但是反射破坏单例 如果回去多个对象,但是都是获取多一个实例
//可以通过反射调用任何访问修饰符的权限
//5.反射调用方法+反射创建对象的升级篇
//1.如何访问带参数的构造方法
//无参的调用
//Assembly assembly1 = Assembly.LoadFrom("");//dll
//Type type1 = assembly1.GetType("");//类名引用
//object noParaObject = Activator.CreateInstance(type);
//调用有参数的 --- 需要传递一个object类型的数组作为参数,没有匹配的会报异常
//object.paraObject = Activator.CreateInstance(type,new object[] { 参数});
//调用方法不一定要类型转换后才使用
//反射调用方法
//1.获取方法 得到MethodInfo
//Assembly assembly1 = Assembly.LoadFrom("");//dll
//Type type1 = assembly1.GetType("");//类名引用
//object noParaObject = Activator.CreateInstance(type);
//MethodInfo show1 = type.GetMethod("show1"); // 调用show方法
//show1.Invoke(noParaObject,new object[] { }); //没有参数
//2.执行Invoke的方法,传递方法所在的类的实例对象+参数
//获取私有的
//MemberInfo show2 = type.GetMethod("show4", BindingFlags.NonPublic | BindingFlags.Instance);
//调用静态方法
//MemberInfo show3 = type.GetMethod("show4");
//show3.Invoke(null, new objectp[] { "" });
//调用泛型方法
//Assembly assembly1 = Assembly.LoadFrom("");//dll
//Type type1 = assembly1.GetType("");//类名引用
//object noParaObject = Activator.CreateInstance(type);
//在调用方法的时候确认泛型的类型
//MemberInfo show = type.GetMethod(new Type[] { typeof(int),...});//里面的方法
//show.Invoke(noParaObject,new object[] {123...);
//调用泛型形参
//Assembly assembly1 = Assembly.LoadFrom("");//dll
//Type type1 = assembly1.GetType("");//类名引用 但是要在后面加 ~多少个形参
//Type type2 = type.MakeGenericType(new Type[] { typeof(int), });
//object noParaObject = Activator.CreateInstance(type2);
//6.反射多种应用场景
//1.反射+配置文件+工厂。
//2.调用方法 -- 需要类型名称 + 方法名称就可以调用到方法。MVC框架
//7.反射的局限性
//1.性能问题 -- 主要损耗性能的是记载Dll的时候会消耗性能
//8.反射调用属性 -- 一个类的内部,
//属性是不保存数据的,字段才保存数据
//如何使用属性和字段
{
//Type type1 = typeof(类名);
//object pObject = Activator.CreateInstance(type1);
//foreach(var prop in type.GetProperties())
//{
// Console.WriteLine(prop.Name); //打印所有的属性
// //逐个属性赋值
// if(prop.Name.Equals("ID"){
// SetValue是设置属性 GetValue是获取属性
// prop.SetValue(pObject,134)
// }
//}
上一篇: FastJSON在Scala中的应用
下一篇: 打印出所有的“水仙花数”