C# 反射理解

news2024/11/13 15:32:36

反射基本功能:

① 在程序运行过程中读取和修改对象中的参数(属性、方法、字段等)

② 通过反射对程序进行更新,不需要改动原程序

反射作用1练习:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace fanshe
{
    class student
    {
        public int age;
        public string name;
        public int ID { get; set; }
        public student(string Name)
        {
            this.name = Name;
        }

        public void show()
        {
            Console.WriteLine("this is shown");
        }

        public void show2(string Age)
        {
            Console.WriteLine($"this is {Age}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            object obj = new student("jerry");
            Type x = obj.GetType();

            //反射作用:① 通过反射遍历成员,并调用成员
            //type的常用属性:Name;full name;namespace
            Console.WriteLine(x.Name);       //student
            Console.WriteLine(x.FullName);   //fanshe.student
            Console.WriteLine(x.Namespace);  //fanshe


            foreach (var item in x.GetFields())
            {
                //显示出当前obj对象中的字段
                Console.WriteLine(item.Name);  //age name
            }

            //输出obj对象中age字段数值
            x.GetField(name: "age").SetValue(obj, 30);
            int y = (int)x.GetField(name: "age").GetValue(obj);
            Console.WriteLine(y);
            Console.WriteLine("//");
            //输出对象属性
            foreach (var item in x.GetProperties())
            {
                Console.WriteLine(item.Name);                   //ID
                Console.WriteLine(item.PropertyType.Name);      //Int32
                Console.WriteLine(item.PropertyType.FullName);  //system.Int32

            }
            var id = x.GetProperty(name: "ID");
            id.SetValue(obj,100);
            Console.WriteLine(id.GetValue(obj));   //100

            Console.WriteLine("/");
            //输出obj对象中的方法
            foreach (var item in x.GetMethods())
            {
                Console.WriteLine(item.Name);
            }
            x.GetMethod(name: "show").Invoke(obj,null);
            x.GetMethod(name: "show2").Invoke(obj,new object[] {"jerry"});
    
            Console.ReadKey();
        }
    }
}

作用2练习:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Environment.CurrentDirectory);
            Assembly ss = Assembly.LoadFile(Environment.CurrentDirectory+ @"\libs\studentmanager.dll");

            foreach (var item in ss.GetTypes())
            {
                Console.WriteLine(item.Name);
                //使用is属性对参数进行过滤,找到想找的内容
                Console.WriteLine(item.IsClass);
                Console.WriteLine(item.IsAbstract);
            }

            Console.WriteLine("///");
            var t = ss.GetTypes().First(x=>x.IsAbstract==false && x.IsClass ==true);
            Console.WriteLine(t.Name);

            //此时是没有对象的,需要重新创建对象
            object obj =  ss.CreateInstance(t.FullName);
            t.GetProperty(name: "Age").SetValue(obj,30);
            t.GetProperty(name: "Name").SetValue(obj,"jerry");
            int kl =  (int)t.GetProperty(name: "Age").GetValue(obj);
            Console.WriteLine(kl);
            t.GetMethod(name: "show").Invoke(obj,new object[] { });

            //t.GetProperty(name: "Age").SetValue(obj,30);
            //t.GetProperty(name: "Name").SetValue(obj,"jerry");

            Console.ReadKey();
        }
    }
}

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

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

相关文章

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外,还会导致占用过多的系统CPU和内存资源,造成系统卡顿、发热、电池消耗过快;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…

智能的编织:C++中auto的编织艺术

在C的世界里,auto这个关键字就像是一个聪明的助手,它能够自动帮你识别变量的类型,让你的代码更加简洁和清晰。下面,我们就来聊聊auto这个关键字的前世今生,以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…

函数式编程Stream流(通俗易懂!!!)

重点:只关注传入的参数列表和方法体(数据操作) 1.Lambda表达式 本质是匿名内部类的优化,先写匿名内部类 1.1 基本用法 public class lambdaTest {public static void main(String[] args) { // int i calculateNum((…

C#里对数组的排序操作

一般情况下是采用 Array.Sort(a) 来进行排序。 例子代码如下: /** C# Program to Sort a String using Predefined Function*/ using System; class linSearch {public static void Main(){Console.WriteLine("Enter Number of Elements you Want to Hold in the Arra…

算法每日双题精讲——双指针(移动零,复写零)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

【Android】View—基础知识,滑动,弹性滑动

基础知识 什么是View 在 Android 中,View 是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是 View 的子类。可以说,View 是构建 Android …

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架,后来有那么一段时间都做定制小软件,框架就没再怎么使用了。 现在要做大型项目了,感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…

【SoC设计指南 基于Arm Cortex-M】学习笔记1——AMBA

AMBA简介 先进微控制器总线架构(Advanced Microcontroller Bus Architecture,AMBA)是用在arm处理器上的片上总线协议规范集。 AMBA总线协议规范集包含AHB、APB、AXI等。 AHB:先进高性能总线(Advanced High-performance Bus) APB&…

pytorch模型转onnx的动态batch转换说明

将PyTorch模型(.pth)转换为ONNX格式时,通常需要指定一个batch size。这是因为ONNX模型需要一个固定的输入形状,而批处理大小是输入形状的一部分。 下面是一个简单的转换示例,假设你已经加载了一个PyTorch模型&#xff…

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计(MLE) 二、最大后验估计(MAP) 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时,MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频: 贝叶斯解释“L1和L2正则化”&#xff…

从0到1基于LangChain制作一个AI猫娘

前言: 看到B站上的AIVtuber的项目落地了,就心血来潮想制作一个AI的猫娘供自己使用,顺便出一个简单的教程,跳过理论,直接实践,作者也还在学习摸索中,所以有错误可以直接在评论区指正。&#xff0…

Vue全栈开发旅游网项目(7)-搜索界面开发及其接口联调

1.搜索界面开发 1.1 模糊查询 文件地址:pycharm- class SightListView(ListView):paginate_by 5def get_queryset(self):#is_validTrue:表中is_valid列,有值则被查询出来query Q(is_validTrue)#1.获得热门景点is_hot self.request.GET.…

python识别ocr 图片和pdf文件

#识别图片 pip3 install paddleocr pip3 install paddlepaddle#识别pdf pip3 install PyMuPDF 重点:路径不能有中文,不然pdf文件访问不了 from paddleocr import PaddleOCR from rest_framework.response import Response from rest_framework.views im…

量化分析工具日常操作日记-5-通合科技

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-5-军工-通合科技(300491)。 周末国家新政策,要大力支持军工行业,我用工具挖掘了两个低位股,供大家参考。通合科技(300491&#xff…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中,SendMessage方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数,它用…

CSS教程(三)- CSS 三大特性

1. 层叠性 介绍 多组CSS样式共同作用于一个元素,就会出现 覆盖(层叠) 另一个冲突的样式。 层叠原则 样式冲突:遵循就近原则(哪个样式离结构近,就执行哪个样式) 样式不冲突,就不会重…

CyclicBarrier使用详解及遇到的坑

上一篇文章讲的是关于是使用CountDownLatch实现生成年底报告遇到的问题,这个计数器和CyclicBarrier也有类似功能,但是应用场景不同。 一、应用场景 CountDownLatch: 有ABCD四个任务,ABC是并行执行,等ABC三个任务都执行完…

Java-I/O框架14:Properties集合及使用

视频链接:16.32 Properties使用(2)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.player.switch&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p32 1.Properties集合 特性: 存储…

Windows下mysql数据库备份策略

Windows下mysql的增量备份和全量备份,并利用schtasks设置定时任务执行bat脚本。 一、备份要求 序号 备份类型 备份频次 备份时间 1 增量备份 每周一-每周六各一次 18:00:00 2 全量备份 每周日一次 18:00:00 二、备份方法 2.1增量备份 2.1.1准备工作…