首页 > 其他分享 >.NET 反射

.NET 反射

时间:2024-05-20 14:21:06浏览次数:22  
标签:反射 Console Name Person person NET Type

.NET中的反射

反射是什么?

反射(Reflection)是.NET框架提供的一种强大的机制,它允许程序在运行时查询和操作对象的类型信息。通过反射,我们能够获取类型的属性、方法、构造函数等信息,甚至可以动态地创建类型实例和调用方法。反射是.NET框架中实现诸如序列化、反序列化、动态代理、依赖注入等高级功能的基础。

反射的具体应用场景

  1. 序列化与反序列化:在进行对象的序列化和反序列化时,反射可以用来访问对象的私有字段。
  2. 动态代理:在创建动态代理时,反射用于获取接口或类的成员信息。
  3. 依赖注入:在依赖注入框架中,反射用于自动解析类的依赖关系。
  4. 单元测试:在进行单元测试时,反射可以用来访问和测试私有成员。
  5. 配置和绑定:在配置应用程序时,反射用于将配置信息绑定到程序集的类型上。

常用的API

反射相关的主要类包括:

  • Type:表示一个类型,是反射操作的核心。
  • MethodInfo:表示一个方法。
  • PropertyInfo:表示一个属性。
  • FieldInfo:表示一个字段。
  • ConstructorInfo:表示一个构造函数。
  • Assembly:表示一个程序集,包含了一个或多个类型。

示例代码

以下是一些使用反射API的示例代码。

示例1:获取类型信息

using System;
using System.Reflection;

public class Person
{
    public string _name;
    public int _age;

    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void IntroduceYourself()
    {
        Console.WriteLine($"Hello, Name: {Name} Age: {Age}");
    }
}

class ReflectionDemo
{
    static void Main(string[] args)
    {
        // 获取Person类型的Type对象
        Type personType = typeof(Person);

        // 获取类型名称
        Console.WriteLine("Type Name: " + personType.Name);

        // 获取构造函数信息
        ConstructorInfo constructor = personType.GetConstructor(new Type[] { typeof(string), typeof(int) });
        Console.WriteLine("Constructor: " + constructor);

        // 创建Person实例
        object personInstance = constructor.Invoke(new object[] { "张三", 30 });

        // 获取方法信息并调用
        MethodInfo methodInfo = personType.GetMethod("IntroduceYourself");
        methodInfo.Invoke(personInstance, null);
    }
}

示例2:访问属性和字段

// 假设Person类定义如上

class ReflectionDemo2
{
    static void Main(string[] args)
    {
            // 创建Person实例
          Person person = new Person("张三", 25);

          // 获取Person类型的Type对象
          Type type = person.GetType();

          // 获取属性信息
          PropertyInfo nameProperty = type.GetProperty("Name");
          PropertyInfo ageProperty = type.GetProperty("Age");

          // 读取属性值
          Console.WriteLine("Name: " + nameProperty.GetValue(person, null));
          Console.WriteLine("Age: " + ageProperty.GetValue(person, null));

          // 获取字段信息
          FieldInfo nameField = type.GetField("_name", BindingFlags.Public | BindingFlags.Instance);
          FieldInfo ageField = type.GetField("_age", BindingFlags.Public | BindingFlags.Instance);

          // 设置字段值
          nameField.SetValue(person, "李四");
          ageField.SetValue(person, 26);

          // 验证字段值更新
          Console.WriteLine("_name: " + nameField.GetValue(person));
          Console.WriteLine("_age: " + ageField.GetValue(person));
    }
}

结论

以上代码展示了反射的基本用法,包括类型信息的获取、实例的创建、方法的调用以及属性的访问。反射是一个非常强大的功能,但同时也要注意,过度使用反射可能会导致性能问题,因为反射操作通常比直接代码调用要慢。

标签:反射,Console,Name,Person,person,NET,Type
From: https://www.cnblogs.com/cqai/p/18201804

相关文章

  • 【.NET项目分享】免费开源的静态博客生成工具EasyBlog,5分钟拥有自己的博客
    EasyBlog说明本博客系统通过构建工具生成纯静态的博客网站,借助GitHubPages,你可以在5分钟内免费拥有个人博客。它具有以下特点生成纯静态网站,访问速度极快使用markdown格式来编写博客内容基于git代码管理来存储你的博客使用CI工具来自动化部署你的博客站点效果展示:NilTo......
  • EDP .Net开发框架--业务模型
    https://www.cnblogs.com/alwaysinsist/p/18190582 业务模型管理中所涉及的业务模型,业务模型的属性,业务模型的视图都是可以通过权限设置来实现数据的行(视图),列(属性)权限管控。业务模型是整个EDP平台的核心基础,数据的查询、新增、修改、删除、行列权限都是通过业务模型来实现的。......
  • Calico 组网(Networking)
    确定最佳网络选项了解Calico支持的不同网络选项,以便您可以选择最适合您需求的选项。Calico灵活的模块化架构支持广泛的部署选项,因此您可以选择适合您的特定环境和需求的最佳网络方法。这包括能够以非覆盖或覆盖模式、带或不带BGP运行各种CNI和IPAM插件以及底层网络类型......
  • .NET 中 Channel 类(内存级消息队列)简单使用
    Channel是干什么的#TheSystem.Threading.Channelsnamespaceprovidesasetofsynchronizationdatastructuresforpassingdatabetweenproducersandconsumersasynchronously.Thelibrarytargets.NETStandardandworksonall.NETimplementations.Channelsa......
  • C#基于.net framework的应用开发实战编程(一) - 编程手把手系列文章
    上次介绍了C#的基于.netframework的Dll类库和Winform的编程过程,今天就来个实战演练一下,结合上次的内容,让读者能够有一个实战的过程,知道怎么用C#进行Winform的编程过程,实现一个小应用。       准备工作;因为软件研发主要从需求、设计、编码、测试、安装这个过程......
  • 记一次 .NET某酒店后台服务 卡死分析
    一:背景1.讲故事停了一个月没有更新文章了,主要是忙于写C#内功修炼系列的PPT,现在基本上接近尾声,可以回头继续更新这段时间分析dump的一些事故报告,有朋友微信上找到我,说他们的系统出现了大量的http超时,程序不响应处理了,让我帮忙看下怎么回事,dump也抓到了。二:WinDbg分析1.为什......
  • EDP .Net开发框架--权限
    平台下载地址:https://gitee.com/alwaysinsist/edp权限介绍权限实际上就是谁有权使用或是访问什么,这里的“谁”可以视作"授权对象","什么"可以视作"权限对象"。例如张三可以访问用户数据,那么张三就是“授权对象”,用户数据就是"权限对象"。权限对象包括业务功能,业务功能元素,W......
  • Vue3+axios+.Net使用分片上传
    Vue3+axios+.Net使用分片上传前端代码在ApiService.cs中增加方法//上传文件publicstaticasyncuploadFile(file){constchunkSize=1024*1024;//1MB每1mb分片consttotalChunks=Math.ceil(file.size/chunkSize);letkey='';lettag=true;leturl=......
  • EDP .Net开发框架--业务模型
    平台下载地址:https://gitee.com/alwaysinsist/edp业务模型概述业务模型管理中所涉及的业务模型,业务模型的属性,业务模型的视图都是可以通过权限设置来实现数据的行(视图),列(属性)权限管控。业务模型是整个EDP平台的核心基础,数据的查询、新增、修改、删除、行列权限都是通过业务模型......
  • net.sf.jsqlparser.schema.Column.withColumnName(Ljava/lang/String;)Lnet/sf/jsqlpar
    https://blog.csdn.net/yuanzhugen/article/details/133648431 SpringBoot整合mybatisplus报错:net.sf.jsqlparser.schema.Column,isavailablefromthefollowinglocationsAnattemptwasmadetocallthemethodnet.sf.jsqlparser.schema.Column.withColumnName(Ljava/l......