C#-反射
一、概念:
1、什么是反射?
① 用于获取同dll中的元素(类、结构)的内容;
② C#编写的程序会编译成一个程序集(.DLL或.exe),其中会包含元数据、编译代码和资源,通过反射可以获取到程序集中的信息;
③ dll信息:dll中的类、结构、属性、方法、特性等。
2、反射的优缺点
① 首先在编译中分为动态编译和静态编译。静态编译是在编译中确定类型,绑定对象;动态编译是在运行中确定类型,绑定对象。
② 反射的优点就是可以动态创建对象、绑定对象,提高了程序的灵活性和扩展性。
③ 降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
④ 但反射是一种解释操作,在性能上不如静态编译快。
二、反射的使用
1、反射的常见使用:
string className = MethodBase.GetCurrentMethod().ReflectedType.FullName; // 获取静态方法类名
Assembly[] allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); // 获取所有程序集
#region 先创建实例后调用
Type type; // 存储类
Object obj; // 存储类的实例
type = Type.GetType("TestClass"); // 通过类名获取同名类
obj = System.Activator.CreateInstance(type); // 创建实例
Type typeList = typeof(List<>);
Type actualType = typeList.MakeGenericType(type);
object obj1 = Activator.CreateInstance(actualType); // 创建实例List
object baseObj = Activator.CreateInstance(typeof(TestClass), "hello world"); // 创建实例
string typeName = type.Name; // 获取类名(不带命名空间)
string typeFullName = type.FullName; // 获取类名(带命名空间)
string dllVersione = assembly_MQTT.GetName().Version; // 应该是产品版本或者文件版本
string typNamespace = type.Namespace; // 获取类的命名空间
Assembly typeAssembly = type.Assembly; // 获取程序集
Type baseType = type.BaseType; // 获取基类类型
ConstructorInfo[] constructorInfo = type.GetConstructors(); // 获取类中的构造函数
Type[] types = type.GetNestedTypes(); // 获取类中的嵌套类
MemberInfo[] memberInfoss = type.GetMembers(); // 获取类中的所有成员
FieldInfo[] fieldInfos = type.GetFields(); // 获取类中的所有字段
PropertyInfo[] propertyInfos = type.GetProperties(); // 获取类中的所有属性
MemberInfo[] memberInfos1s = type.GetMember("member1"); // 获取类中名为“member1”的成员
FieldInfo fieldInfo1 = type.GetField("field1"); // 获取类中名为“field1”的字段
PropertyInfo propertyInfo1 = type.GetProperty("property1"); // 获取类中名为“property1”的属性
fieldInfo1.SetValue(obj, "hello world"); // 给类中名为“field1”的字段赋值
fieldInfo1.SetValue(obj, "property1"); // 给类中名为“property1”的属性赋值
MethodInfo method = type.GetMethod("Method", new Type[] { }); // 调用方法,参数为空
method.Invoke(obj, null);
method = type.GetMethod("Method", new Type[] { typeof(string) }); // 调用方法,有参数
method.Invoke(obj, new object[] { "hello" });
method = type.GetMethod("Method", new Type[] { typeof(string), typeof(string) }); // 调用方法,有参数,有返回值
string result = (string)method.Invoke(obj, new object[] { "hello", "你好" });
#endregion 先创建实例后调用
2、获取其他dll中的类:
public readonly string appPath = AppDomain.CurrentDomain.BaseDirectory; // App目录
Assembly assembly = Assembly.LoadFrom(appPath + "你的DLL.dll"); // 加载类库
Type entityType = assembly.GetType($"带命名空间的类名");
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/16902574.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-11-18 C#-验证文件完整性的方法