反射笔记 我一直在不断学习
反射笔记
笔记以问题的形式记录,搞清楚这些问题,就是理解了反射.本笔记为阅读博客园中张子阳的文章之后所做的笔记,更多详细的记录,请访问这里.
1. 反射的基础是什么?
程序集,自定义特性,泛型.
2. 反射是什么?
是一种在运行时获得程序集或者类型的基本信息和元数据的机制.
3. 反射有什么用途?
(作者的一个例子是绑定下拉列表.)分三类:
1) 查看或者遍历类型或者程序集的基本信息或者元数据;
2) 动态的获得类型的实例,并调用它的成员.
3) 迟绑定(这个我还不明白,但是我知道替代分支语句的就是迟绑定).
4. 获得Type对象的三种方法?(也许不止三种,暂时我就记这三种)
1) Type.GetType(“类型的名称(带上命名空间)”);
2) typeof(类型的名称(带上命名空间));
3) 类型的实例.GetType();
5.获得程序集的两种方法?(也许不止两种,暂时我就记这三种)
1) Assembly.loadFrom(“程序集的名称.dll(全路径的,如果当前程序引用了直接写名称.dll)”);
2) Assembly.load(“程序集的名称”);
6.Type和程序集的关系辩证?(若不对,欢迎指正啊!)
通过Type可以获得类型所在的程序集,程序集包含很多类型(Type).但是最终获得成员信息主要是通过Type进行的,获得类型的基本信息跟获得程序集的基本信息有些不一样,类型的基本信息肯定没有module。
7.怎么通过Type的实例获得该类型的成员信息?
1) 获得成员
MemberInfo[] memberinfos=type.GetMembers();//获得类型的所有成员;
MemberInfo[] memberinfos=type.GetMembers(BindingFlags的枚举类型);//还可根据参数重载获得需要的成员。
2) 获得方法
MemberInfo[]
methods=type.FindMembers(MemberTypes.Method,BindingFlags的枚举类型,Type.FilterName,”*”);//第一个参数说明获得的是方法,第二个是条件,第三个是按照名字过滤,第四个表示返回所有的方法。
MethodInfo[]
methods=type.GetMethods();//
3) 获得字段
FieldInfo[] fields=type.GetFields();//获得所有字段,可以重载
4) 获得属性
PropertyInfo[] fields = type.GetProperties();
5) 获得构造函数
ConstructorInfo[] cons = type.GetConstructors();
6)获得事件
EventInfo[] events= type.GetEvents();
7)自定义特性
Object[] objects = type.GetCustomAttributes(typeof(ObsoleteAttribute),true);
8)基本信息
使用vs的提示,获得类型对象之后,可以看到如下信息,这些就是Type可以获得的类型基本信息。
8.怎么动态的获得类型的实例,并调用它的方法?
动态获得类型的实例有两种方法:分别如下,
Object obj = asm.CreateInstance("String",true);
Object obj1 = asm.CreateInstance("String",true,BindingFlags.Default,null,newObject[]{},null,null);
ObjectHandle handle= Activator.CreateInstance(null,"String");
调用方法:
使用InvokeMember调用方法
type.InvokeMember("subString",BindingFlags.InvokeMethod, null,typeof(System.String) ,new Object[] { });
使用MethodInfo.Invoke调用方法
MethodInfo ms = type.GetMethod("subString",BindingFlags.Instance);
ms.Invoke(obj, new Object[] { });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库