欢迎来到《小5讲堂》
这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

【C#】已经实体类和动态实体类的反射使用方法,两分钟回顾,码上就懂_c#


目录

  • 小背景
  • 已知实体类名
  • 动态实体类名
  • 反射概念
  • 相关文章


小背景

最近在做一个项目,用比较简单粗暴的开发方式,可以认为是敏捷开发,
没有使用现有成熟的多层架构和工厂模式等高大上的技术。
因此,稍微会接触到一些相对底层的东西,或者需要封装的一些方法,
那么实体类的动态反射就派上用场了。

已知实体类名

定义实体类结构如下

public class StudentModel
{
    public string Name { get; set; }
    public int Age { get; set; }
    public decimal Score { get; set; }
    public DateTime AddTime { get; set; }
    public bool IsOk { get; set; }
}

反射方式一:直接获取类型

StudentModel studentModel = new StudentModel()
 {
     Name = "张三",
     Age = 23,
     Score = 93.90m,
     AddTime = DateTime.Now,
     IsOk = true
 };

 Type type = typeof(StudentModel);
 PropertyInfo[] proArr1 = type.GetProperties();
 foreach (PropertyInfo pi in proArr1)
 {
     string dataType = pi.PropertyType.Name;
     string key = pi.Name;
     string value = $"{pi.GetValue(studentModel, null)}";
 }

【C#】已经实体类和动态实体类的反射使用方法,两分钟回顾,码上就懂_实体类_02


反射方式二:先实例化再获取类型

StudentModel studentModel = new StudentModel()
 {
     Name = "张三",
     Age = 23,
     Score = 93.90m,
     AddTime = DateTime.Now,
     IsOk = true
 };

StudentModel model = new StudentModel();
Type type2 = model.GetType();
PropertyInfo[] proArr2 = type2.GetProperties();
foreach (PropertyInfo pi in proArr2)
{
    string dataType = pi.PropertyType.Name;
    string key = pi.Name;
    string value = $"{pi.GetValue(studentModel, null)}";
}

【C#】已经实体类和动态实体类的反射使用方法,两分钟回顾,码上就懂_实体类_03

动态实体类名

上面是通过已经类名和实例化类进行反射。
如果封装一个方法,方法内进行动态T实体类进行反射,那么又是如何做呢?
封装方法,代码如下:

public void Get<T>(T studentModel) where T : class, new()
{
    Type type = typeof(T);
    PropertyInfo[] proArr1 = type.GetProperties();
    foreach (PropertyInfo pi in proArr1)
    {
        string dataType = pi.PropertyType.Name;
        string key = pi.Name;
        string value = $"{pi.GetValue(studentModel, null)}";
    }

    T model = new T();
    Type type2 = model.GetType();
    PropertyInfo[] proArr2 = type2.GetProperties();
    foreach (PropertyInfo pi in proArr2)
    {
        string dataType = pi.PropertyType.Name;
        string key = pi.Name;
        string value = $"{pi.GetValue(studentModel, null)}";
    }
}

调用代码:

StudentModel studentModel = new StudentModel()
 {
     Name = "张三",
     Age = 23,
     Score = 93.90m,
     AddTime = DateTime.Now,
     IsOk = true
 };

 Get(studentModel);

效果:

【C#】已经实体类和动态实体类的反射使用方法,两分钟回顾,码上就懂_android_04

总结下,动态反射,实际上就是和已知实体类一样,只不过是在封装方法里加了一个T表示可进行任意实体类的反射

反射概念

反射(Reflection)是C#中的一种强大技术,它允许程序在运行时检查和修改自身的类型信息。通过反射,您可以获取类的类型、字段、属性和方法等详细信息,并在运行时动态调用它们。
反射的主要作用包括:
1.类型检查:您可以使用反射来检查一个对象是否实现了某个接口或继承了某个类。
2.动态调用:通过反射,您可以动态地调用方法,即使该方法在编译时并未被调用。
3.属性访问:反射允许您获取和设置对象的属性值,即使这些属性在编译时并未被访问。
4.类型转换:在某些情况下,您可能需要将对象转换为不同的类型,反射可以帮助您实现这种转换。