C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

news2024/11/26 14:25:28

文章目录

  • 前言
  • 反射是什么?
  • 常用类型操作
    • Summry
    • PropertyInfo
    • MethodInfo
      • 无参函数运行
    • 有参函数运行,获取paramterInfo
  • 总结

前言

我之前写了一篇Attribute特性的介绍,成功拿到了Attribute的属性,但是如果把Attribute玩的溜,那就要彻底了解反射。

C#高级语法 Attribute特性详解和类型,方法,变量附加特性讲解

反射是什么?

反射就是对一个类里面所有的元素的彻底描述。我们可以从特性看出C# 对基于反射的类型定义了。

【C#进阶】C# 特性

在这里插入图片描述

我们声明一个简单的类


namespace NETCore8.Models
{
    public class TestModel
    {

        public int Id { get; set; }

        private string name;

        public void Send()
        {

        }
        /// <summary>
        /// 发送测试
        /// </summary>
        /// <param name="name"></param>
        public void TestSend(string name)
        {

        }
        public TestModel()
        {

        }
    }
}

在这里插入图片描述

常用类型操作

我们接下来的操作全部都是基于共有属性进行的操作

Summry

但是Summry不属于编译内容,属于注解,如果想要获取Summry信息,则需要安装一个Nuget:Namotion.Refelction

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PropertyInfo

       static void Main(string[] args)
  {
      
      //声明一个简单的bindingFlags
      BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;

      TestModel model = new TestModel();
      model.Id = 5;

      
      var propertyInfo =  model.GetType().GetProperty("Id");

      Console.WriteLine("属性名:"+ propertyInfo?.Name);
      Console.WriteLine("属性值:" + propertyInfo?.GetValue(model));
      Console.WriteLine("属性类型:" + propertyInfo?.PropertyType);
      propertyInfo.SetValue(model, 10);
      Console.WriteLine("修改后的属性值:" + propertyInfo.GetValue(model));

      //如果你安装了Namotion.Refelction,可以使用封装好的扩展方法
      Console.WriteLine("Namotion.Refelction:" + model.TryGetPropertyValue<int>("Id"));

      Console.WriteLine("Hello, World!");
      Console.ReadKey();
  }

在这里插入图片描述

MethodInfo

无参函数运行

在这里插入图片描述

        static void Main(string[] args)
        {


            TestModel model = new TestModel();

            var methodInfo = model.GetType().GetMethod("Send");

            if (methodInfo != null)
            {
                Console.WriteLine($"方法名:{methodInfo.Name}");
                Console.WriteLine($"返回值:{methodInfo.ReturnType}");
                Console.WriteLine("运行方法");
                methodInfo.Invoke( model, null );
            }


            Console.WriteLine("Hello, World!");
            Console.ReadKey();
        }

在这里插入图片描述

有参函数运行,获取paramterInfo

在这里插入图片描述

internal class Program
{
    static void Main(string[] args)
    {


        TestModel model = new TestModel();

        var methodInfo = model.GetType().GetMethod("TestSend");
        //如果你装了Namotion.Refelction,可以使用Xml方法获取注解
        if (methodInfo!= null )
        {
            Console.WriteLine($"方法名:{methodInfo.Name}");
            Console.WriteLine($"返回值:{methodInfo.ReturnType}");
            Console.WriteLine($"方法注解:{methodInfo.GetXmlDocsSummary()}");
            var parmeters = methodInfo.GetParameters();

            foreach (var item in parmeters)
            {
                Console.WriteLine($"参数名:{item.Name}");
                Console.WriteLine($"参数类型:{item.ParameterType}");
                Console.WriteLine($"参数注解:{item.GetXmlDocs()}");
            }
            Console.WriteLine("运行方法,注意无法解决重载问题,因为重载的方法名相同,会直接抛出异常");
            Console.WriteLine("运行方法的参数类型和个数必须完全一致");
            methodInfo.Invoke(model, new object[] { "入参",1 });
        }

        Console.WriteLine("Hello, World!");
        Console.ReadKey();
    }
}

在这里插入图片描述

总结

我们将反射类型的常用内容已经讲解完了。接下来我们将主要讲解Attribute的详细运用。经过这么久的铺垫,我们终于可以开始正常的讲解了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1357535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章带你了解基于 Jenkins 流水线方式部署的好处

在软件开发过程中&#xff0c;部署是将代码从开发环境转移到生产环境的关键步骤。传统的部署方式可能涉及多个手动步骤和容易出错的过程。然而&#xff0c;基于 Jenkins 流水线方式部署可以带来许多好处&#xff0c;包括提高效率、一致性和可靠性。本文将探讨基于 Jenkins 流水…

k_d树, KNN算法学习笔记_1 距离和范数

k_d树, KNN算法学习笔记_1 距离和范数 二维树中最近邻搜索的示例。这里&#xff0c;树已经构建好了&#xff0c;每个节点对应一个矩形&#xff0c;每个矩形被分割成两个相等的子矩形&#xff0c;叶子对应于包含单个点的矩形 From Wikipedia 1&#xff0e; k k k近邻法是基本且简…

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知&#xff0c;在以往TI电赛真题的学习…

简单多状态dp问题(打家劫舍Ⅱ)

通过分类谈论&#xff0c;将环形的问题&#xff0c;转化成两个线性的 “ 打家劫舍Ⅰ ” 1.状态表示 2.状态转移方程 3.初始化 f[ 0 ] nums[ 0 ] g[ 0 ] 0 4.填表顺序 从左往右填表&#xff0c;两个表一块填 5.返回值 max( f[ n-1 ] , g [ n - 1 ] )

VM安装虚拟机及初始化操作

一、VM下载及暗转 虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;在实体计算机中能够完成的工作在虚拟机中都能够实现。VMware 是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的…

YOLOv8改进 | 2023Neck篇 | 利用Gold-YOLO改进YOLOv8对小目标检测

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

轻量化网络-MobileNet系列

整理备忘 目录 1. MobileNetV1 1.1 论文 1.2 网络结构 1.3 深度可分离卷积 1.4 计算量下降了 1.5 参数量下降了 2. MobileNetV2 2.1 论文 2.2 网络结构 2.3 效果 3. MobileNetV3 3.1 论文 3.2 网络结构 3.3 效果 1. MobileNetV1 1.1 论文 https://arxiv.org/a…

晨控CK-GW08-EC与欧姆龙PLC工业EtherCAT协议通讯指南

晨控CK-GW08-EC与欧姆龙PLC工业EtherCAT协议通讯指南 晨控CK-GW08系列是一款支持标准工业通讯协议EtherCAT的网关控制器,方便用户集成到PLC等控制系统中。系统还集成了8路读写接口&#xff0c;用户可通过通信接口使用EtherCAT协议对8路读写接口所连接的读卡器进行相对独立的读…

ocrmypdf_pdf识别

安装 安装说明 https://ocrmypdf.readthedocs.io/en/latest/installation.html#native-windows提到需要的软件&#xff1a; Python 3.7 (64-bit) or later Tesseract 4.0 or later Ghostscript 9.50 or later 安装 ocrmypdf pip install ocrmypdf 添加语言包 https://oc…

sqlserver工具插入表语法into新表问题

文章目录 sqlserver工具插入表语法into新表问题 sqlserver工具插入表语法into新表问题 into新表问题 SELECT 1 AS FID, AS FNUMBER,1 AS FVALUE,A AS FVALUE2,名字 AS FNAME, 你的全名 FFULLNAME INTO t_user_mmINSERT INTO t_user_mm VALUES(2,2,2,B,懒人,懒人咖)INSERT I…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

探秘Spring Bean的秘境:作用域篇【beans 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Spring Bean的秘境&#xff1a;作用域篇【beans 三】 前言单例作用域如何声明单例Bean&#xff1a;特点&#xff1a; 原型作用域如何声明原型Bean&#xff1a;特点&#xff1a; 会话作用域如何声明…

基于粒子群算法的参数拟合,寻优算法优化测试函数

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 粒子群算法参数拟合 代码 结果分析 展望 基于粒子群算法的参数拟合(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88698417 摘要 寻优算法,测试…

Node.js+Express+Mysql实现分页查询

根据记录数总数和分页数获到页总数 function pageCount (totalnum,limit){return totalnum > 0 ? ((totalnum < limit) ? 1 : ((totalnum % limit) ? (parseInt(totalnum / limit) 1) : (totalnum / limit))) : 0; } 接收请求代码 router.get(/api/user/page, asy…

iOS UITextField复制、粘贴框显示为英文如何解决

问题描述&#xff1a; 使用UITextField&#xff0c;欲粘贴文本&#xff0c;长按或者双击展示的提示框显示为英文 解决方案&#xff1a; 在Xcode配置文件info,plist文件中&#xff0c;新增Localizas属性&#xff0c;填入Chinese 结果如下&#xff1a; 提示框成功展示为中文

PostgreSQL 分区

由于大量数据存储在数据库同一张表中&#xff0c;后期性能和扩展会受到影响。所以需要进行表分区&#xff0c;因为它可以将大表分成较小的表&#xff0c;从而减少内存交换问题和表扫描&#xff0c;最终提高性能。庞大的数据集被分成更小的分区&#xff0c;更易于访问和管理。 …

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

Matlab/F#/R进行数据分析和建模算法的经验,vb.net输给他了

微软放弃了vb.net的开发&#xff0c;但是持续花费巨资投入F#,简单一看他的语法就是qbasic ,vb6一样。鹿死谁手&#xff0c;谁能相信vb.net竟然被f#给干掉了。外面有vb6语法的python成了全球第一的编程语言,内部还有强大的教授开发的这工具扯后腿。 有人说为什么中国搞不出像mat…

【数据结构】链表简介及单链表的实现

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 链表1.1 链表的概念及结构1.2 链表的分类1.3 无头单向非循环链表的实现 1. 链表 1.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序…

Jvm垃圾收集器系列之Parallel Scavenge收集器(个人见解仅供参考)

问&#xff1a;什么是Parallel Scavenge&#xff1f; 答&#xff1a;Parallel Scavenge是Java HotSpot虚拟机中的一种垃圾收集器&#xff0c;它主要用于提高应用程序的吞吐量。 问&#xff1a;Parallel Scavenge的主要目标是什么&#xff1f; 答&#xff1a;Parallel Scavenge的…