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($"带命名空间的类名");
posted @   ꧁执笔小白꧂  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-11-18 C#-验证文件完整性的方法
点击右上角即可分享
微信分享提示