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

打印 上一主题 下一主题

主题 671|帖子 671|积分 2013

 一、使命一二:遍历、获取、设置字段的值

使命一:获取实体的全部字段,输出字段名、字段范例、字段值
使命二:获取实体的指定字段,输出该字段值、赋值该字段值
(entity和field都是属性,stu是带有数据的实体)
【不封装实现】
  1. using ConsoleApp1;
  2. using SqlSugar;
  3. using System.Reflection;
  4. class Program
  5. {
  6.     public class Student
  7.     {
  8.         public int id { get; set; }
  9.         public string name { get; set; }
  10.         public int age { get; set; }
  11.     }
  12.     static void Main()
  13.     {
  14.         Student stu = new Student { id = 1, name = "小苏", age = 18 };
  15.         //任务一:遍历打印这个实体的字段名,字段类型,字段的值
  16.         foreach (var entity in typeof(Student).GetProperties())
  17.         {
  18.             Console.Write($"entity Name: {entity.Name}, ");
  19.             Console.Write($"Type: {entity.PropertyType.Name}, ");
  20.             Console.WriteLine($"Value: {entity.GetValue(stu)}");
  21.         }
  22.         //任务二:获取stu的age字段,将age的字段值设置为20
  23.         //获取到Age属性
  24.         var field = typeof(Student).GetProperties().First(x=>x.Name=="age");
  25.         //通过属性反射给实体赋值
  26.         field.SetValue(stu, 20);
  27.         //查看赋值后的结果
  28.         var resultage = field.GetValue(stu);
  29.         Console.WriteLine(resultage);
  30.         ;
  31.     }
  32. }
复制代码
使命一:获取实体的全部字段,输出字段名、字段范例、字段值
使命二:获取实体的指定字段,输出该字段值、赋值该字段值
(entity和field都是属性,stu是带有数据的实体)
【小封装实现-更好理解】
  1. using ConsoleApp1;
  2. using SqlSugar;
  3. using System.Reflection;
  4. class Program
  5. {
  6.     public class Student
  7.     {
  8.         public int id { get; set; }
  9.         public string name { get; set; }
  10.         public int age { get; set; }
  11.     }
  12.     /// <summary>
  13.     /// 获取实体的所有属性
  14.     /// </summary>
  15.     /// <typeparam name="T"></typeparam>
  16.     /// <returns></returns>
  17.     static PropertyInfo[] GetEntity<T>() where T : class
  18.     {
  19.         return typeof(T).GetProperties();
  20.     }
  21.     /// <summary>
  22.     /// 获取实体的某个属性
  23.     /// </summary>
  24.     /// <typeparam name="T"></typeparam>
  25.     /// <param name="Fieldname"></param>
  26.     /// <returns></returns>
  27.     static PropertyInfo GetField<T>(string Fieldname) where T : class
  28.     {
  29.         return typeof(T).GetProperties().First(x => x.Name == Fieldname);
  30.     }
  31.     static void Main()
  32.     {
  33.         Student stu = new Student { id = 1, name = "小苏", age = 18 };
  34.         //任务一:遍历打印这个实体的字段名,字段类型,字段的值
  35.         foreach (var entity in GetEntity<Student>())
  36.         {
  37.             Console.Write($"entity Name: {entity.Name}, ");
  38.             Console.Write($"Type: {entity.PropertyType.Name}, ");
  39.             Console.WriteLine($"Value: {entity.GetValue(stu)}");
  40.         }
  41.         //任务二:获取stu的age字段,将age的字段值设置为20
  42.         //获取到Age属性
  43.         var field = GetField<Student>("age");
  44.         //通过属性反射给实体赋值
  45.         field.SetValue(stu, 20);
  46.         //查看赋值后的结果
  47.         var resultage = field.GetValue(stu);
  48.         Console.WriteLine(resultage);//20
  49.         
  50.     }
  51. }
复制代码
(封装代码)
  1.     /// <summary>
  2.     /// 获取实体的所有属性(属性列表)
  3.     /// </summary>
  4.     /// <typeparam name="T"></typeparam>
  5.     /// <returns></returns>
  6.     static PropertyInfo[] GetEntity<T>() where T : class
  7.     {
  8.         return typeof(T).GetProperties();
  9.     }
  10.     /// <summary>
  11.     /// 获取实体的某个属性(单个属性)
  12.     /// </summary>
  13.     /// <typeparam name="T"></typeparam>
  14.     /// <param name="Fieldname"></param>
  15.     /// <returns></returns>
  16.     static PropertyInfo GetField<T>(string Fieldname) where T : class
  17.     {
  18.         return typeof(T).GetProperties().First(x => x.Name == Fieldname);
  19.     }
复制代码
二、使命三:获取指定范例的字段名称

【封装的方法】
  1. using ConsoleApp1;
  2. using SqlSugar;
  3. using System.Reflection;
  4. class Program
  5. {
  6.     public class Student
  7.     {
  8.         public int id { get; set; }
  9.         public string name { get; set; }
  10.         public int age { get; set; }
  11.     }
  12.     /// <summary>
  13.     /// 获取实体的所有属性
  14.     /// </summary>
  15.     /// <typeparam name="T"></typeparam>
  16.     /// <returns></returns>
  17.     static PropertyInfo[] GetEntity<T>() where T : class
  18.     {
  19.         return typeof(T).GetProperties();
  20.     }
  21.     static List<string> GetintField<T>(T entity) where T : class
  22.     {
  23.         List<string> result = new List<string>();
  24.         foreach (var item in GetEntity<T>())
  25.         {
  26.             if (item.PropertyType==typeof(int))
  27.             {
  28.                 result.Add(item.Name);
  29.             }
  30.         }
  31.         return result;
  32.     }
  33.     static List<string> GetintField2<T>() where T : class
  34.     {
  35.         List<string> result = new List<string>();
  36.         foreach (var item in GetEntity<T>())
  37.         {
  38.             if (item.PropertyType == typeof(int))
  39.             {
  40.                 result.Add(item.Name);
  41.             }
  42.         }
  43.         return result;
  44.     }
  45.     static void Main()
  46.     {
  47.         Student stu = new Student { id = 1, name = "小苏", age = 18 };
  48.         //任务三:获取指定类型(例如int类型)的字段名称
  49.         //以下两种方法都可以,只是入参不一样
  50.         var result = GetintField(stu);
  51.         var result2 = GetintField2<Student>();
  52.         //输出id,age
  53.     }
  54. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表