首页 > 编程语言 >C#反射使用

C#反射使用

时间:2024-04-18 13:44:46浏览次数:23  
标签:反射 Console C# testClass testCase int BindingFlags WriteLine 使用

using System.Reflection;

namespace TestReflection
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("TestReflection");
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");

            //实例化
            TestReflectionClass testCase = new TestReflectionClass() { publicUnStatic = 5 };
            TestReflectionClass.publicStatic = 10;

            //获得指定类型所在程序集
            Assembly testClassAssembly = Assembly.GetAssembly(typeof(TestReflection.TestReflectionClass));

            //获取测试类型
            Type testClass = testClassAssembly.GetType("TestReflection.TestReflectionClass");

            //获取所有public字段
            FieldInfo[] publicFields = testClass.GetFields();
            foreach (FieldInfo field in publicFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取所有private非static字段
            FieldInfo[] privateFields = testClass.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (FieldInfo field in privateFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取所有private static字段
            FieldInfo[] privateStaticFields = testClass.GetFields(BindingFlags.NonPublic | BindingFlags.Static);
            foreach (FieldInfo field in privateStaticFields) { Console.WriteLine(field.Name); }
            Console.WriteLine("****************************************");

            //获取public非static字段
            FieldInfo publicUnstaticField = testClass.GetField("publicUnStatic");
            Console.WriteLine("publicUnstaticField value:" + publicUnstaticField.GetValue(testCase));
            Console.WriteLine("****************************************");

            //获取public static字段
            FieldInfo publicStaticField = testClass.GetField("publicStatic");
            Console.WriteLine("publicStaticField ByInstance value:" + publicStaticField.GetValue(testCase));
            Console.WriteLine("publicStaticField ByClass value:" + publicStaticField.GetValue(null));
            Console.WriteLine("****************************************");

            //获取private非static字段
            FieldInfo privateUnstaticField = testClass.GetField("privateUnStatic", BindingFlags.Instance | BindingFlags.NonPublic);
            Console.WriteLine("privateUnstaticField value:" + privateUnstaticField.GetValue(testCase));
            Console.WriteLine("****************************************");

            //获取private static字段
            FieldInfo privateStaticField = testClass.GetField("privateStatic", BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("privateStaticField ByInstance value:" + privateStaticField.GetValue(testCase));
            Console.WriteLine("privateStaticField ByClass value:" + privateStaticField.GetValue(null));
            privateStaticField.SetValue(null, 100);
            Console.WriteLine("privateStaticField after Set:" + privateStaticField.GetValue(null));
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");


            //获取所有属性
            PropertyInfo[] properties = testClass.GetProperties();
            foreach (PropertyInfo property in properties) { Console.WriteLine(property.Name); }
            Console.WriteLine("property value:" + testClass.GetProperty("PublicProperty").GetValue(testCase));
            testClass.GetProperty("PublicProperty").SetValue(testCase, 100);
            Console.WriteLine("property value:" + testClass.GetProperty("PublicProperty").GetValue(testCase));
            Console.WriteLine("****************************************");
            Console.WriteLine("****************************************");

            //获取所有public方法
            MethodInfo[] publicMethods = testClass.GetMethods();
            foreach (MethodInfo method in publicMethods) { Console.WriteLine(method.Name); }
            Console.WriteLine("****************************************");

            //获取所有private方法
            MethodInfo[] privateMethods = testClass.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (MethodInfo method in privateMethods) { Console.WriteLine(method.Name); }
            Console.WriteLine("****************************************");

            //反射调用公共普通方法
            MethodInfo testFunc1 = testClass.GetMethod("TestFunc");
            testFunc1.Invoke(testCase, null);
            Console.WriteLine("****************************************");

            //反射调用公共带参方法
            MethodInfo testFunc2 = testClass.GetMethod("TestFuncWithParam");
            Console.WriteLine(testFunc2.Invoke(testCase, new object[] { 6, 7 }));
            Console.WriteLine("****************************************");

            //反射调用私有普通方法
            MethodInfo testFuncp1 = testClass.GetMethod("PTestFunc", BindingFlags.NonPublic | BindingFlags.Instance);
            testFuncp1.Invoke(testCase, null);
            Console.WriteLine("****************************************");

            //反射调用私有带参方法
            MethodInfo testFuncp2 = testClass.GetMethod("PTestFuncWithParam", BindingFlags.NonPublic | BindingFlags.Instance);
            Console.WriteLine(testFuncp2.Invoke(testCase, new object[] { 6, 7 }));
            Console.WriteLine("****************************************");

            Console.WriteLine();
            Console.ReadKey();
        }
    }

    public class TestReflectionClass
    {
        /// <summary>
        /// 私有字段
        /// </summary>
        private int privateUnStatic;
        /// <summary>
        /// 私有静态字段
        /// </summary>
        private static int privateStatic;

        /// <summary>
        /// 公共字段
        /// </summary>
        public int publicUnStatic;
        /// <summary>
        /// 公共静态字段
        /// </summary>
        public static int publicStatic;

        /// <summary>
        /// 公共属性
        /// </summary>
        public int PublicProperty
        {
            set
            {
                privateUnStatic = value;
                Console.WriteLine("PublicProperty Set 已执行");
            }
            get
            {
                Console.WriteLine("PublicProperty Get 已执行");
                return privateUnStatic;
            }
        }

        /// <summary>
        /// 公共无参方法
        /// </summary>
        public void TestFunc()
        {
            Console.WriteLine("公共方法");
        }

        /// <summary>
        /// 公共有参方法
        /// </summary>
        public int TestFuncWithParam(int a, int b)
        {
            int sum = a + b;
            return sum;
        }

        /// <summary>
        /// 私有无参方法
        /// </summary>
        private void PTestFunc()
        {
            Console.WriteLine("私有方法");
        }

        /// <summary>
        /// 私有有参方法
        /// </summary>
        private int PTestFuncWithParam(int a, int b)
        {
            int sum = a + b;
            return sum;
        }
    }
}

 

标签:反射,Console,C#,testClass,testCase,int,BindingFlags,WriteLine,使用
From: https://www.cnblogs.com/REGO101100/p/18143338

相关文章

  • LibreOJ-3038 「JOISC 2019 Day3」穿越时空 Bitaro <线段树> 题解
    审题一条链每条边有通行时间上下界限制通过一条边需要\(1\)单位时间站在当前节点时间减少\(1\)耗费\(1\)单位代价\(q\)次询问要么更改一条边的通信时间上下界要么询问在\(b\)时刻在城市\(a\),\(d\)时刻到达城市\(c\)的最小代价思想做题准备......
  • 【Docker】Docker部署Redis
    ✨Docker本文介绍DockerDesktop以及docker命令行的简单使用DockerDesktop安装使用请查阅官方文档GetDocker|DockerDocumentation在Windows上安装DockersDesktop可参考【Docker】DockerDesktopforWindows(WSL2)安装-双份浓缩馥芮白-博客园(cnblogs.com)似乎......
  • IfcDimensionsForSiUnit
    IfcDimensionsForSiUnit函数定义ISO/CD10303-41:1992中的定义:函数返回给定SI单位的尺寸指数。参数定义:N:(输入)将返回维度指数的单位的名称。 FUNCTIONIfcDimensionsForSiUnit(n:IfcSiUnitName):IfcDimensionalExponents;CASEnOFMETRE:RETURN......
  • # Linux From Scratch 12.1 安装笔记
    目录目录安装指南相关链接准备工作准备宿主机准备硬盘下载软件添加LFS用户配置环境开始构建构建过程概述构建LFS交叉工具链和临时工具进入Chroot并构建其他工具构建LFS系统安装软件系统配置安装内核安装引导安装指南版本12.1-systemd-中文翻译......
  • springcloud alibaba gateway网关鉴权
    登录鉴权:在gateway网关中实现全局过滤器GlobalFilter以及拦截器的顺序Ordered,在nacos中配置好需要放行的路径(如登录/login),获取请求头中的用户id,组装reids的key,来redis中存放的value,即token,再获取请求头中的token来跟redis中的value值进行比对,一致则放行,否则抛出异常。核心代码如......
  • c语言程序实验——实验报告六
    c语言程序实验————实验报告六实验项目名称:实验报告6循环结构程序设计(for语句的应用)实验项目类型:验证性实验日期:2024年4月15日一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解......
  • GoldenGate抽取进程extract延迟处理
    前言一套GoldenGate环境,已经运行了很多年,一直比较正常,Extract抽取进程基本上没有出现延迟的情况,但这次突然出现抽取延迟,其中一个抽取进程延迟高达50个小时左右。 处理过程1.当前有两个抽取进程,分别为:E_HXZG、E_SBFSC,目前出现延迟的是第1个抽取进程。检查该进程的当前状态......
  • centos7 修改root密码 密码忘记的情况下
    1、重启虚拟机开启虚拟机在弹出这个界面时,按上下键防止页面跳转,选择"CentOSLinux(3.10.0-1160.e17.x8664)7(Core)"并按e 2、找到linux16开头的那行将rocrashkernel=autoxxx,把ro换成rwinit=/sysroot/bin/sh  3、 使用组合键Ctrl+X进入单用户模式 chroot......
  • Go 单元测试之mock接口测试
    目录一、gomock工具介绍二、安装三、使用3.1指定三个参数3.2使用命令为接口生成mock实现3.3使用make命令封装处理mock四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩(stub)参数六、总结6.1测试用例定义6.2设计测试用例6.3执行测试用例代码6.4运行测......
  • SpringCloud(七.4)ES(elasticsearch)-- DSL查询语法
    DSL查询语法 1、查询所有以下是简写和全写 总结:  2、全文检索查询(match)全文检索查询,会对用户输入内容分词,常用于搜索框搜索: 回顾在 SpringCloud(七.3)ES(elasticsearch)--RestClient操作 中创建索引时添加的all字段,以及字段拷贝copy_to。这里all字段就派上了用......