C# 反射手记

C#反射 优点: 1. 提高程序的灵活性与可扩展性,耦合度; 缺点: 1. 过多使用,会造成逻辑模糊,因为反射已经绕过的源码,看不到逻辑实现,会造成后期维护上的困扰 2. 性能的问题,使用反射处在解释的操作,主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用 小结:.Net应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(... 阅读详情

从代码中学习吧

可以把 TestInterface 块里的方法放进 Main 执行来对应的理解

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ReflectionLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintClassStaticMethodInfo();
        }

        #region TestInterface

        #region GetMembers
        private static void PrintClassPublicInfo(Type varType)
        {
            //返回公开成员;
            MemberInfo[] tempMemInfos = varType.GetMembers();
            ShowMemberConsoleInfo(tempMemInfos);
        }
        private static void PrintClassAllInfo(Type varType)
        {
            //包含非公开、包含实例成员、包含公开;
            //此处含父类的成员;
            MemberInfo[] tempMemInfos = varType.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            ShowMemberConsoleInfo(tempMemInfos);
        }
        private static void PrintClassSelfInfo(Type varType)
        {
            //包含非公开、包含实例成员、包含公开;
            //BindingFlags.DeclaredOnly 表明 不含父类的成员;
            MemberInfo[] tempMemInfos = varType.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
            ShowMemberConsoleInfo(tempMemInfos);
        }

        private static void PrintClassSelfInclueStaticInfo(Type varType)
        {
            //包含非公开、包含实例成员、包含公开;
            //BindingFlags.DeclaredOnly 表明 不含父类的成员;
            MemberInfo[] tempMemInfos = varType.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static);
            ShowMemberConsoleInfo(tempMemInfos);
        }
        #endregion

        #region GetFields

        private static void PrintClassFieldsInfo()
        {
            Type tempType = typeof(RefClass);
            RefClass tempRc = new RefClass();
            tempRc.pIntMember = 3;

            FieldInfo[] tempFieInfos = tempType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static);
            foreach (FieldInfo tempInfo in tempFieInfos)
            {
                if (tempInfo.Name == "mIntMember")
                {
                    tempInfo.SetValue(tempRc,999);
                }
                if (tempInfo.Name == "<mIntProperty>k__BackingField")
                {
                    //属性方法;
                    tempInfo.SetValue(tempRc, 777);
                }
                Console.WriteLine("名称: " + tempInfo.Name + "  --  类型: " + GetMemberType(tempInfo.MemberType) + " - 值: " + tempInfo.GetValue(tempRc));
            }
            Console.ReadKey();
        }

        private static void PrintClassPropertyInfo()
        {
            Type tempType = typeof(RefClass);
            RefClass tempRc = new RefClass();
            tempRc.pIntMember = 3;

            PropertyInfo[] tempPropertyInfos = tempType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static);
            foreach (PropertyInfo tempInfo in tempPropertyInfos)
            {
                MethodInfo tempGetInfo = tempInfo.GetGetMethod(true);
                Console.WriteLine("get方法的名称{0}  返回值类型:{1}  参数数量:{2}  MSIL代码长度:{3} 局部变量数量:{4}", 
                    tempGetInfo.Name, tempGetInfo.ReturnType.ToString(),
                    tempGetInfo.GetParameters().Count(),
                    tempGetInfo.GetMethodBody().GetILAsByteArray().Length, 
                    tempGetInfo.GetMethodBody().LocalVariables.Count);

                MethodInfo tempSetInfo = tempInfo.GetSetMethod(true);
                Console.WriteLine("get方法的名称{0}  返回值类型:{1}  参数数量:{2}  MSIL代码长度:{3} 局部变量数量:{4}", 
                    tempSetInfo.Name, tempSetInfo.ReturnType.ToString(),
                    tempSetInfo.GetParameters().Count(),
                    tempSetInfo.GetMethodBody().GetILAsByteArray().Length,
                    tempSetInfo.GetMethodBody().LocalVariables.Count);

               tempSetInfo.Invoke(tempRc, new object[] { 666 });
               object obj = tempGetInfo.Invoke(tempRc, null);
               Console.WriteLine("方法名:{0}  内部值:{1}", tempInfo.Name, obj);
            }
            Console.ReadKey();
        }

        #endregion

        #region StaticMethods
        private static void PrintClassStaticMethodInfo()
        {
            Type tempType = typeof(RefClass);
            RefClass tempRc = new RefClass();
            tempRc.pIntMember = 3;

            MethodInfo[] tempPropertyInfos = tempType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static);
            foreach (MethodInfo tempInfo in tempPropertyInfos)
            {
                if (tempInfo.GetParameters().Count() > 0 && tempInfo.GetParameters()[0].ParameterType == typeof(string) )
                {
                    object obj = tempInfo.Invoke(tempRc, new[] { "123" });
                    MethodBody mbody = tempInfo.GetMethodBody();
                    Console.WriteLine("拥有参数的方法名:{0}  返回值类型:{1}  参数1类型:{2}  参数1名称:{3}  方法调用后返回的值:{4}",
                        tempInfo.Name,
                        tempInfo.ReturnType.ToString(),
                        tempInfo.GetParameters()[0].ParameterType.ToString(),
                        tempInfo.GetParameters()[0].Name,
                        obj.ToString());
                }
                else
                {
                    MethodBody mbody = tempInfo.GetMethodBody();
                    Console.WriteLine("没有参数的方法名:{0}  返回值类型:{1}",
                        tempInfo.Name,
                        tempInfo.ReturnType.ToString());
               }
            }
            Console.ReadKey();
        }
        #endregion

        #endregion

        #region LogicBusiness
        private static void ShowMemberConsoleInfo(MemberInfo[] varMemInfos)
        {
            foreach (MemberInfo tempInfo in varMemInfos)
            {
                Console.WriteLine("名称: " + tempInfo.Name + "  --  类型: " + GetMemberType(tempInfo.MemberType));
            }
            Console.ReadKey();
        }


        private static string GetMemberType(MemberTypes varMemType)
        {
            string tempTypeStr = string.Empty;
            switch (varMemType)
            {
                case MemberTypes.Field:
                    {
                        tempTypeStr = "字段";
                    }break;
                case MemberTypes.Method:
                    {
                        tempTypeStr = "方法";
                    }break;
                case MemberTypes.Property:
                    {
                        tempTypeStr = "属性";
                    }break;
                case MemberTypes.Constructor:
                    {
                        tempTypeStr = "构造函数";
                    } break;
                case MemberTypes.Custom:
                    {
                        tempTypeStr = "自定义成员";
                    } break;
                case MemberTypes.Event:
                    {
                        tempTypeStr = "事件";
                    } break;
                case MemberTypes.NestedType:
                    {
                        tempTypeStr = "嵌套";
                    } break;
                case MemberTypes.TypeInfo:
                    {
                        tempTypeStr = "类型";
                    } break;
                default:
                    {
                        tempTypeStr = "未知";
                    }break;
            }
            return tempTypeStr;
        }

        #endregion

    }

    #region DefineInfo

    public class RefClass
    {
        private int mIntMember;
        private int mIntProperty { get; set; }
        protected int mProteInt;
        public int pIntMember { get; set; }

        public CustomClassOne mCustomClass;

        public void AnyOne()
        {

        }
        public static void ThisIsStaticMethodOne()
        {

        }
        public static void ThisIsStaticMethodTwo()
        {

        }

        public static string HadReturnValueA(string varStr)
        {
            int tempIntA;
            int tempIntB;
            return varStr;
        }
        public static string HadReturnValueB(string varStr)
        {
            string tempStr;
            return varStr;
        }
    }

    public class CustomClass
    {
        public int MCustomInt;

    }

    public class CustomClassOne : CustomClass
    {
        public int MCustomInt;
        public static CustomClassTwo mCustomClassTwo;
    }

    public class CustomClassTwo : CustomClass
    {
        public int MCustomInt;

    }

    #endregion

}
C# 高级--反射 详解 C#来自于System.Reflection,是一个帮助类库,可以读取dll/exe中metadata,使用metadata创建对象。获取方法MethodInfo,执行MethodInfo 的Invoke方法,传递方法所在的类的实例对象+参数。需要传递一个object类型的数组作为参数,参数按照从昨往右严格匹配,如果没有匹配的报异常。中间语言,编译把高级语言编译后得到的C#中最真实的语言状态,面向对象语言。需要通过方法参数类型类区别方法,传递参数,严格匹配参数类型。一种反射技术,可以动态创建dll/exe。 阅读详情

相关推荐

C# 反射详解

反射是C#中的一个强大特性,允许程序在检查和操作类型和对象的信息。通过反射,你可以获取类型的等信息,并可以动态创建对象、调用方法或访问属性,甚至可以实现某些框架或库的核心功能。

我爱JAVA 1756

C# 学习笔记:反射

这篇文章重新写反射,在很久之前的那一篇博客中曾经非常粗劣的描述了一下反射的基础用法(感觉跟没讲一样),这一篇博客我们重新归纳一下反射,就像彩虹六号中重置赫里福基地一样。 反射这个功能来自于代码中的加载需求,因为我们代码中一个程序往往会有很多配套的程序集,这些程序集往往不是自己熟悉甚至自己见过的,它们可能来自于公司的另一个部门或者其他公司,也有可能在我们程序本体发布以后才发布的这些程序集,所以我们...

MEIGAZAMU 1110

C#编程-使用反射检索元数据

术语反射通常用来指镜像。如果您站在镜子面前,镜子会反射出您的所有物理属性,如:您的身高、肤色和身体结构。在C#中也一样,反射被用于反射程序有关的所有信息。C#程序可以利用反射获得类在运行时的信息。反射在运行时获取类型信息的过程中被使用。提供运行时程序元数据信息的类在System.Reflection名称空间中。System.Refection名称空间包含的类允许程序员获取关于正在运行的应用程序信息以及将类型、值和对象动态添加到那个应用程序。

RZer的博客 1191

C# 反射

http://www.cnblogs.com/yaozhenfa/p/CSharp_Reflection_1.html 1、获取全部公共成员(包括基类): Type t = typeof(RefClass); MemberInfo[] minfos = t.GetMembers(); 2、获取全部成员(外加私有,受保护) MemberInfo[] minfos = t.G...

BusyMonkey 529

C#的反射

一、反射介绍 反射:指程序可以访问、检测和修改它本身状态或行为的一种能力(即:审查元数据并收集关于它的类型信息的能力) ①元数据(编译以后的最基本数据单元)可以理解为一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。 ②反射则提供了封装程序集、模块和类型的对象(程序集包含模块,而模块包含类型,类型又包含成员【成员--->类型--->模块--->程序集】)。 ③可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象..

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

详解C#反射(Reflection)

详解C#反射的概念和用法

ellis1970的博客 2090

C#中的反射

反射:指程序可以访问,检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以 调用类型的方法或访问其字段和属性。 优点: 1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高自适应能力。 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。 缺点: 1、性能问题...

a1040660846的博客 1373

Python爬虫(一)京东商品价格及详情页抓取

这是一个以http://item.jd.com/2957726.html为例的单网页抓取案例 import urllib.request; #载入urllib.request,用于获取页面html源代码 from pandas import Series; #载入series包 from pandas import DataFrame; #载入dataframe包 from bs4 impo

Data Proc 1万+

c#反射-从Type搜寻成员

除了Type可以描述类型的信息以外。还有字段,属性,方法,构造器,事件等类型,用于描述各自的成员。以下是示例类。

zms9110750的博客 348

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 419

Unity - gamma space下还原linear space效果

还有头发之后的 (头发没有处理完整,因为使用 ASE 连连看练出来的,使用 surface shader,虽然可以生成一下 vert, frag 的方式在修改,但是我懒得去修改了,这样就是 PBR 的 BRDF 里面的部分曲线是不一样的,所以可以看到头发有一些差异)其实上面的代码判断 是否有分量 > 1.0f 的方式来判断是否 HDR 是不太合理的,因为不同的贴图格式的编码方式不同。还有比较隐蔽的一些颜色相关的常量值 (比如PBR中的 绝缘体的 F0 常量值,等等)

Jave.Lin 的学习笔记 2828

c#之反射详解

C#之反射详解

鲤籽鲲的博客 2万+

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5862

C#反射详解

目录 反射定义反射(C# 编程指南) 使用场景 形象说明 反射的用途 反射用到的主要类 System.Type类用法 实例应用 System.Reflection.Assembly类的用法 反射定义反射(C# 编程指南)   反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。 使用场景 需要访问程序元数据的特性。 检查..

潘达小新 5776

GD32H7 SPI驱动实战:手把手教你用SPI3连接外部Flash(W25Q128)并实现读写

本文详细介绍了基于GD32H7系列MCU的SPI3接口驱动W25Q128外部Flash的全流程开发指南。从硬件设计、引脚配置到SPI3外设深度配置,再到底层通信函数实现和高级功能优化,提供了完整的解决方案。特别针对高速读取、DMA传输和信号完整性等关键环节进行了优化,确保系统在-40℃~85℃范围内稳定工作。

weixin_28729205的博客 379

NX二次开发 内部函数鼠标动态位置获取

内部函数鼠标动态位置获取

qq285503851的博客 3336

【C#进阶】C# 反射

关于编程语言 C# 反射的介绍。

好学若饥,谦卑若愚。 3112

2.2 保姆级教程:手把手带你构建第一个 LangGraph 应用

本文是一份保姆级教程,手把手教你构建第一个LangGraph应用——"智能工具助手"Agent。教程分为8个步骤:从环境准备到工具定义(使用Tavily搜索API和自定义计算器),再到定义图状态、创建决策节点和执行节点,最后连接工作流并编译运行。通过这个项目,你将学会如何让Agent智能选择工具(搜索或计算),掌握LangGraph开发的基本流程,为构建更复杂系统打下基础。关键点包括状态管理、节点设计和条件路由的实现。

yonggeit的博客 3115

详谈C#反射及应用

反射 什么是元数据?什么是反射? 程序数用来处理数据的,文本和特性都是数据,而程序本身(类的定义和BLC中的类)这些也是数据。 有关程序及其类型的数据被称为元数据,他们保存在程序集中。 程序在运行时,可以查看其他程序集或其本身元数据。一个运行的程序查看本身的元数据或其他程序集的元数据的行为称为反射。 Type 使用 Type 类进行反射,使用特性给类型添加元数据 对于程序中用到的每个类型,CLR 都会创建一个包含这个类型信息的 Type 对象。 程序中每用到一个类型都会关联到独立的 Type 类的对象

菜鸟厚非 2万+

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 153

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#之反射

动态创建类型实例调用类型的方法访问类型的字段和属性检查类型的元数据(如基类、接口、特性等)运行时类型检查和操作能力动态代码执行的基础框架和库开发的关键技术它可能破坏封装性性能开销较大代码可读性可能降低最佳实践在需要高度灵活性的场景使用(如插件系统、序列化)缓存反射结果以提高性能考虑使用动态类型或源代码生成作为替代方案始终处理可能的反射异常通过合理使用反射,你可以构建出更加灵活和可扩展的C#应用程序。

Major_S的博客 1524

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 随手记-技能拆分
下一篇: SublimeText 注册码 & 常用插件
Admin_Jhon
博客等级 码龄11年 19粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值