首页 > 编程语言 >C# 使用反射进行类型信息的动态获取

C# 使用反射进行类型信息的动态获取

时间:2024-12-04 23:01:43浏览次数:6  
标签:反射 类型信息 C# System 获取 myClassType MyClass 类型 using

  1. 反射基础概念

    • 反射是指在运行时动态地获取程序集、模块、类型、成员(方法、属性、字段等)的相关信息,并且能够在运行时动态地调用类型的成员或创建类型的实例。在C#中,System.Reflection命名空间提供了进行反射操作的各种类和接口。
  2. 获取类型信息

    • 获取当前程序集中的类型
      • 可以使用Assembly.GetExecutingAssembly方法获取当前正在执行的程序集,然后通过GetTypes方法获取程序集中包含的所有类型。例如:
      using System;
      using System.Reflection;
      
      class Program
      {
          static void Main()
          {
              Assembly assembly = Assembly.GetExecutingAssembly();
              Type[] types = assembly.GetTypes();
              foreach (Type type in types)
              {
                  Console.WriteLine($"类型名称: {type.Name}");
              }
          }
      }
      
      • 在这个示例中,GetExecutingAssembly获取了当前程序集,GetTypes返回一个包含程序集中所有类型的数组,然后通过循环打印出每个类型的名称。
    • 通过类型名称获取类型
      • 如果知道类型的名称,可以使用Type.GetType方法来获取类型。例如:
      using System;
      using System.Reflection;
      
      class Program
      {
          static void Main()
          {
              // 获取System.String类型
              Type stringType = Type.GetType("System.String");
              Console.WriteLine($"类型名称: {stringType.Name}");
          }
      }
      
      • 这里Type.GetType方法的参数是类型的完全限定名。需要注意的是,对于简单类型,如int(实际上是System.Int32),要使用完整的名称;对于自定义类型,要包含命名空间和类型名。
  3. 获取类型成员信息

    • 获取方法信息
      • 对于已经获取的类型,可以使用Type.GetMethods方法获取该类型的所有公共方法。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public void MyMethod()
          {
              Console.WriteLine("这是MyMethod方法");
          }
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              MethodInfo[] methods = myClassType.GetMethods();
              foreach (MethodInfo method in methods)
              {
                  Console.WriteLine($"方法名称: {method.Name}");
              }
          }
      }
      
      • 在这个示例中,GetMethods返回一个MethodInfo数组,其中包含了MyClass类型的所有公共方法的信息。可以通过MethodInfo对象获取方法的参数类型、返回类型等更多详细信息。
    • 获取属性信息
      • 使用Type.GetProperties方法来获取类型的属性信息。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public int MyProperty { get; set; }
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              PropertyInfo[] properties = myClassType.GetProperties();
              foreach (PropertyInfo property in properties)
              {
                  Console.WriteLine($"属性名称: {property.Name}");
              }
          }
      }
      
      • 这里GetProperties返回一个PropertyInfo数组,包含了MyClass类型的所有公共属性的信息。通过PropertyInfo对象可以获取属性的类型、是否可读、是否可写等信息。
    • 获取字段信息
      • 要获取类型的字段信息,可以使用Type.GetFields方法。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public int MyField;
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              FieldInfo[] fields = myClassType.GetFields();
              foreach (FieldInfo field in fields)
              {
                  Console.WriteLine($"字段名称: {field.Name}");
              }
          }
      }
      
      • GetFields方法返回一个FieldInfo数组,其中包含了MyClass类型的所有公共字段的信息。可以通过FieldInfo对象获取字段的类型等信息。
  4. 动态创建类型实例

    • 可以使用Activator.CreateInstance方法来动态创建类型的实例。例如:
    using System;
    using System.Reflection;
    
    class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("这是MyClass的构造函数");
        }
    }
    class Program
    {
        static void Main()
        {
            Type myClassType = typeof(MyClass);
            object instance = Activator.CreateInstance(myClassType);
        }
    }
    
    • 在这个示例中,首先获取了MyClass的类型对象,然后使用Activator.CreateInstance方法创建了一个MyClass的实例。如果类型有带参数的构造函数,CreateInstance方法也有相应的重载形式来传递参数。
  5. 动态调用类型成员

    • 动态调用方法
      • 对于已经获取的MethodInfo对象,可以使用Invoke方法来动态调用方法。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public void MyMethod(int param)
          {
              Console.WriteLine($"这是MyMethod方法,参数为 {param}");
          }
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              object instance = Activator.CreateInstance(myClassType);
              MethodInfo method = myClassType.GetMethod("MyMethod");
              object[] parameters = new object[] { 10 };
              method.Invoke(instance, parameters);
          }
      }
      
      • 在这个示例中,首先创建了MyClass的实例,然后获取了MyMethodMethodInfo对象,准备好参数数组,最后通过Invoke方法动态调用MyMethod,传递实例和参数。
    • 动态访问属性
      • 对于属性,可以通过PropertyInfo对象的GetValueSetValue方法来动态访问属性的值。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public int MyProperty { get; set; }
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              object instance = Activator.CreateInstance(myClassType);
              PropertyInfo property = myClassType.GetProperty("MyProperty");
              // 设置属性值
              property.SetValue(instance, 20);
              // 获取属性值
              object value = property.GetValue(instance);
              Console.WriteLine($"属性值为: {value}");
          }
      }
      
      • 这里先获取了属性的PropertyInfo对象,然后通过SetValue设置属性值,再通过GetValue获取属性值并输出。
    • 动态访问字段
      • 对于字段,可以使用FieldInfo对象的GetValueSetValue方法来动态访问。例如:
      using System;
      using System.Reflection;
      
      class MyClass
      {
          public int MyField;
      }
      class Program
      {
          static void Main()
          {
              Type myClassType = typeof(MyClass);
              object instance = Activator.CreateInstance(myClassType);
              FieldInfo field = myClassType.GetField("MyField");
              // 设置字段值
              field.SetValue(instance, 30);
              // 获取字段值
              object value = field.GetValue(instance);
              Console.WriteLine($"字段值为: {value}");
          }
      }
      
      • 先获取FieldInfo对象,然后通过SetValueGetValue方法来设置和获取字段的值。

标签:反射,类型信息,C#,System,获取,myClassType,MyClass,类型,using
From: https://blog.csdn.net/weixin_39604653/article/details/144227089

相关文章

  • #渗透测试#SRC漏洞挖掘#红蓝攻防#黑客工具之Burp Suite介绍05-网页端抓包与app小程序
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。                             ......
  • C# 文件操作方法大全
    文件创建与删除类操作File.Create方法:用于创建一个新文件。例如:File.Create("newFile.txt");。File.Delete方法:用于删除指定的文件。例如:File.Delete("fileToDelete.txt");。FileInfo.Create方法(通过FileInfo类):首先创建FileInfo对象,再调用此方法创建文件。如FileInfofile......
  • 全面解析:使用Python实现Docx转Pdf及PDF OCR处理的自动化流程(附完整代码)
    在数字化办公环境中,文档格式转换与内容提取是日常工作中经常遇到的需求。本文将详细介绍如何使用Python构建一个自动化流程,实现从.docx文件转换为.pdf,然后对.pdf文件进行OCR(光学字符识别)处理,最终将识别结果保存为Word文档。整个流程涵盖了文件转换、图像处理、OCR识别和结果整......
  • c语言:语句详解
    算法的概念及特点在说c语句前我们先了解一下算法的概念及特点广义的说、为解决一个问题采取的方法和有限的步骤,就称为“算法”数据结构+算法=程序数据结构:对数的描述算法:操作的步骤就比如把大象放进冰箱里需要几步:对我们程序员来说把大象放进冰箱里只需要三步1......
  • Java 反射:揭开方法和构造函数的神秘面纱
    Java反射:揭开方法和构造函数的神秘面纱在Java编程的世界中,反射(Reflection)是一项强大而神秘的技术。它允许我们在运行时检查和操作类、方法、字段等,甚至可以调用私有方法或访问私有字段。然而,反射的强大之处也伴随着一些容易混淆的概念,比如getMethods()和getDeclaredMethods......
  • CDCL算法
    1.CDCL伪代码CDCL(CNF):副本=CNF//创建CNF的副本,不更改原CNFwhiletrue:while副本含有单位子句:对副本使用单位传播;if副本中含有取值为假的子句://发现冲突if现在的决策层是0:returnfalse;......
  • Exponential Recency Weighted Average Branching Heuristic for SAT SolversExponent
    1.CHB(conflicthistory-basedbranchingheuristic)分支策略1.1奖励函数\(numConflicts\)从搜索开始发生冲突的总次数\(lastConflict[v]\)文字\(v\)在冲突分析出现,则\(lastConflict[v]=numConflicts\)\(multiplier\)取值为1.0或0.9。\(multiplier=1.0\)当分支、传播......
  • docker常用命令汇总-持续更新中
    容器卷dockervolume用法:dockervolume[command]dockervolumerm[OPTIONS]VOLUME[VOLUME...]#删除数据卷dockervolumecreatefor_tomcat#创建volume数据卷,名称叫for_tomcatdockervolumels#查看当前所有数据卷......
  • 51c视觉~合集23
    我自己的原文哦~  https://blog.51cto.com/whaosoft/11859242#工业缺陷检测中数据标注需要注意的几个事项在工业场景中,网络结构决定了下限,数据决定着上限,要想模型有好的表现,数据是至关重要的。下面就这个项目来说一说,工业缺陷检测在标注数据时需要注意的几个事项:1、离得......
  • C 语言实现物体检测:使用 YOLO 模型
    环境准备在进行物体检测之前,确保你已经在C语言环境中安装了以下软件:OpenCV用于图像处理。Darknet用于YOLO模型训练和推理。安装步骤:安装OpenCV:bashsudoapt-getinstalllibopencv-dev安装Darknet:bashgitclonehttps://github.com/pjreddie/darknet.gitcd......