当前位置: 首页 > news >正文

C#高级:通过一个遍历实体的小案例去理解反射(基础版)

 

目录

 

一、任务一二:遍历、获取、设置字段的值(手到擒来)

二、任务三:获取指定类型的字段名称(绝群拔类)

三、任务四:通过反射打印列表(反客为主)


一、任务一二:遍历、获取、设置字段的值(手到擒来

任务一:获取实体的所有字段,输出字段名、字段类型、字段值

任务二:获取实体的指定字段,输出该字段值、赋值该字段值

(field是属性,stu是带有数据的实体)

【不封装实现】

using ConsoleApp1;
using SqlSugar;
using System.Reflection;class Program
{public class Student{public int id { get; set; }public string name { get; set; }public int age { get; set; }}static void Main(){Student stu = new Student { id = 1, name = "小苏", age = 18 };//任务一:遍历打印这个实体的字段名,字段类型,字段的值foreach (var field in typeof(Student).GetProperties()){Console.Write($"field Name: {field.Name}, ");Console.Write($"Type: {field.PropertyType.Name}, ");Console.WriteLine($"Value: {field.GetValue(stu)}");}//任务二:获取stu的age字段,将age的字段值设置为20//获取到Age属性var field = typeof(Student).GetProperties().First(x=>x.Name=="age");//通过属性反射给实体赋值field.SetValue(stu, 20);//查看赋值后的结果var resultage = field.GetValue(stu);Console.WriteLine(resultage);;}
}

任务一:获取实体的所有字段,输出字段名、字段类型、字段值

任务二:获取实体的指定字段,输出该字段值、赋值该字段值

(field都是属性,stu是带有数据的实体)

【小封装实现-更好理解】

using ConsoleApp1;
using SqlSugar;
using System.Reflection;class Program
{public class Student{public int id { get; set; }public string name { get; set; }public int age { get; set; }}/// <summary>/// 获取实体的所有属性/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>static PropertyInfo[] GetEntity<T>() where T : class{return typeof(T).GetProperties();}/// <summary>/// 获取实体的某个属性/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Fieldname"></param>/// <returns></returns>static PropertyInfo GetField<T>(string Fieldname) where T : class{return typeof(T).GetProperties().First(x => x.Name == Fieldname);}static void Main(){Student stu = new Student { id = 1, name = "小苏", age = 18 };//任务一:遍历打印这个实体的字段名,字段类型,字段的值foreach (var field in GetEntity<Student>()){Console.Write($"field Name: {field.Name}, ");Console.Write($"Type: {field.PropertyType.Name}, ");Console.WriteLine($"Value: {field.GetValue(stu)}");}//任务二:获取stu的age字段,将age的字段值设置为20//获取到Age属性var field = GetField<Student>("age");//通过属性反射给实体赋值field.SetValue(stu, 20);//查看赋值后的结果var resultage = field.GetValue(stu);Console.WriteLine(resultage);//20}
}

(封装代码)

    /// <summary>/// 获取实体的所有属性(属性列表)/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>static PropertyInfo[] GetEntity<T>() where T : class{return typeof(T).GetProperties();}/// <summary>/// 获取实体的某个属性(单个属性)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Fieldname"></param>/// <returns></returns>static PropertyInfo GetField<T>(string Fieldname) where T : class{return typeof(T).GetProperties().First(x => x.Name == Fieldname);}

二、任务三:获取指定类型的字段名称(绝群拔类

【封装的方法】

using ConsoleApp1;
using SqlSugar;
using System.Reflection;class Program
{public class Student{public int id { get; set; }public string name { get; set; }public int age { get; set; }}/// <summary>/// 获取实体的所有属性/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>static PropertyInfo[] GetEntity<T>() where T : class{return typeof(T).GetProperties();}static List<string> GetintField<T>(T entity) where T : class{List<string> result = new List<string>();foreach (var item in GetEntity<T>()){if (item.PropertyType==typeof(int)){result.Add(item.Name);}}return result;}static List<string> GetintField2<T>() where T : class{List<string> result = new List<string>();foreach (var item in GetEntity<T>()){if (item.PropertyType == typeof(int)){result.Add(item.Name);}}return result;}static void Main(){Student stu = new Student { id = 1, name = "小苏", age = 18 };//任务三:获取指定类型(例如int类型)的字段名称//以下两种方法都可以,只是入参不一样var result = GetintField(stu);var result2 = GetintField2<Student>();//输出id,age}
}

三、任务四:通过反射打印列表(反客为主

【实现代码】

using ConsoleApp1;
using SqlSugar;
using System.Reflection;class Program
{public class Student{public int id { get; set; }public string name { get; set; }public int age { get; set; }}/// <summary>/// 获取实体的所有属性/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>static PropertyInfo[] GetEntity<T>() where T : class{return typeof(T).GetProperties();}/// <summary>/// 通过反射获取实体的某个属性/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <param name="index"></param>/// <returns></returns>static object? ReflexGetValue<T>(T entity,int index) where  T : class{return GetEntity<T>()[index].GetValue(entity);}static void Main(){List<Student> stulist = new List<Student> { new Student { id = 1, name = "小苏", age = 18 }, new Student { id = 2, name = "小明", age = 17 }, new Student { id = 3, name = "小虹", age = 19 } };//任务四:通过反射遍历打印实体列表(反客为主)Console.WriteLine("----------直接打印-----------");foreach (var item in stulist){Console.WriteLine(item.id);Console.WriteLine(item.name);Console.WriteLine(item.age);}Console.WriteLine("-----------反射1-------------");foreach (var item in stulist){Console.WriteLine(ReflexGetValue(item,0));Console.WriteLine(ReflexGetValue(item, 1));Console.WriteLine(ReflexGetValue(item, 2));}Console.WriteLine("-----------反射2-------------");foreach (var item in stulist){for (var i = 0; i < GetEntity<Student>().Length; i++){Console.WriteLine(ReflexGetValue(item, i));}}/*打印效果(都一样):1小苏182小明173小虹19        */}
}

【封装方法】

    /// <summary>/// 获取实体的所有属性/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>static PropertyInfo[] GetEntity<T>() where T : class{return typeof(T).GetProperties();}/// <summary>/// 通过反射获取实体的某个属性/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <param name="index"></param>/// <returns></returns>static object? ReflexGetValue<T>(T entity,int index) where  T : class{return GetEntity<T>()[index].GetValue(entity);}

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python之字符串的创建、索引和分片
  • 深入理解 GO 语言并发
  • 双配置视觉 Transformer 在多模态中的突破 !
  • Linux服务器:Samba配置
  • Java - 正则表达式
  • Memecoin的火爆与AMM在Solana上的主导地位
  • 嵌入式八股-C++面试30题(20240814)
  • Hibernate Session在项目中的创建方式
  • Nginx+Tomcat 群集
  • python发送外部请求
  • element 动态设置el-table 高度
  • Unity脚本一键修改所有预制体
  • Spring之@ComponentScan注解
  • HTTP/1.1
  • 【ACM独立出版丨接受全文摘要投稿】2024年生物医药和智能技术国际学术会议(ICBIT 2024,8月23-25)
  • 自己简单写的 事件订阅机制
  • 【comparator, comparable】小总结
  • 0基础学习移动端适配
  • dva中组件的懒加载
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA多线程机制解析-volatilesynchronized
  • jdbc就是这么简单
  • Lsb图片隐写
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • ReactNative开发常用的三方模块
  • React系列之 Redux 架构模式
  • REST架构的思考
  • Xmanager 远程桌面 CentOS 7
  • 创建一个Struts2项目maven 方式
  • 动态魔术使用DBMS_SQL
  • 给初学者:JavaScript 中数组操作注意点
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端代码风格自动化系列(二)之Commitlint
  • 深入浅出webpack学习(1)--核心概念
  • 我感觉这是史上最牛的防sql注入方法类
  • ​configparser --- 配置文件解析器​
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ## 基础知识
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (13)DroneCAN 适配器节点(一)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C#)获取字符编码的类
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (接口封装)
  • (六)Hibernate的二级缓存
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)C#调用WebService 基础
  • (自用)gtest单元测试
  • ./configure、make、make install 命令
  • .NET C# 操作Neo4j图数据库
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径