反射与属性

Python动态属性与反射机制方式 Python被誉为一种具备卓越灵活性的编程语言,它的众多卖点之一便是对反射与动态属性的支持。所谓反射能力,是指程序在执行期间对对象的属性和方法实施检查、存取以及修改的能力。动态属性则允许程序员在运行时为对象新增、读取及调整属性。正是这些能力,赋予了Python在打造易于配置、可横向扩展且智能的应用程序方面的巨大潜力。2. 反射的基本原理作为Python的利器之一,反射允许程序员在程序运行的任一时刻询问对象,获取关于其属性和方法的元数据,并据此进行相应的存取及修改操作。获取对象的属性值。 阅读详情
 
反射与属性
反射是编程的读取与类型相关联的元数据的行为,通过元数据,你能了解它是什么类型以及它是由什么构成的(方法、属性、基类).
反射服务在system.Reflection命名空间中定义,它在和属性一起使用时最有用。
属性是一种向类型添加信息并影响类型行为的方法。
反射还允许在运行期间定义新类型,并生成相应的IL代码和元数据(使用在System.Reflection.Emit命名空间中的各种服务。
 
System.Type
基类Object定义了GetType()方法,使得你能对任何.NET对象调用这个方法
public class MyClass
{ ... }
 
int number = 0;
MyClass obj = new MyClass();
 
Type type1 = number.GetType();
Type type2 = number.GetType();
 
typeof运算符允许你直接检索与一个类型相关联的Type值,而无需实例化该类型的一个对象
Type type1 = typeof(int);
Type type2 = typeof(MyClass);
 
Type使你可以获取类型的元数据
 
Type type = typeof(MyClass);
string name = type.ToString();
Debug.Assert(name == “MyClass”);
 
示例:使用Type.GetMethods()来反射一个类型的公共方法
using System.Reflection;
 
public class MyClass
{
       public MyClass()
       {}
       public void Method1()
       {}
       public static void Method2()
       {}
       protected void Method3()
       {}
       protected void Method4()
       {}
}
 
//客户端代码
Type type = typeof(MyClass);
 
MethodInfo[] methodInfoArray = type.GetMethods();
 
//跟踪所有的公共方法
foreach (MethodInfo methodInfo in methodInfoArray)
{
       Trace.WriteLine(methodInfo.Name);
}
 
//输出
GetHashCode
Equals
ToString
Method1
Method2
GetType
 
GetMethods()的另一个版本,接受一个参数,告知如何绑定到该类型:
public abstract MethodInfo[] GetMethods(BindingFlags bindingAttr);
 
BindingFlags枚举,指定:实例方法、静态方法、非公共方法等
 
取得方法的MethodInfo对象,就可以调用它,即使该方法是受保护的或是私有的:
public object Invoke(object obj, object[] parameters);
晚绑定调用
 
示例:使用反射调用对象的私有方法
using System.Reflection;
 
public class MyClass
{
       public MyClass()
       { ... }
       public void Method1()
       { ... }
      
       public void Method2()
       { ... }
 
       public static void Method5()
       { ... }
 
       protected void Method3()
       { ... }
 
       private void Method4()
       { ... }
}
 
//客户端代码
MyClass obj =- new MyClass();
Type type = typeof(MyClass);
 
MethodInfo[] methodInfoArray;
methodInfoArray = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
 
//仅调用私有方法
foreach (MethodInfo methodInfo in methodInfoArray)
{
       if (methodInfo.IsPrivate)
       {
              methodInfo.Invoke(obj, null);
}
}
 
GetMethod() ----------- MethodInfo
GetConstructors()、 GetConstructor() ------------------ ConstructorInfo
GetMember()、GetMembers()
GetEvent()、GetEvents()
 
属性
想法:可以用属性来修饰对象,而不需要通过编程实现各种功能和特性
 
属性本身是一个类,应该在名称中包含Attribute后缀,而且它必须派生于Attribute类:
 
public class FlagsAttribute : Attribute
{ ... }
 
如果属性名称是以Attribute结尾的,编译器允许省略Attribute后缀
[Flags]
public enum Color
{
       Red, Green, Blue, Purple = Red | Blue
}
 
每一个属性都有一个与它相关的AttributeUsage类型的属性,它指明了该属性应该用于哪种类型(类、接口、枚举等),哪种语法元素(构造函数、方法、参数、返回值等)。
AttributeUsage也指定同一属性是否能在目标上使用多次
 
属性能够有一个默认的构造函数,并可以接受多个构造参数。如果有一个默认构造函数,可以使用带括号的属性,也可使用不带括号的属性。
[MyAttribute()]
 
属性种类
.NET有三种属性。
标准属性:标准属性是.NET自带的,.NET编译器和运行时知道这些属性并遵照它们的指示。
自定义属性:自己提供的属性,除非编译器添加它们作为元数据的一部分,否则它们完全会被.NET忽略,你必须编写反射代码来使用自定义属性。这些属性经常包含具体问题域的定义
自定义上下文属性:你和.NET都可以提供自定义上下文属性。.NET完全注意到它们,会遵从它们的指令并相应地影响修饰对象
 
实现自定义属性
示例:实现一个自定义属性
public enum ColorOption { Red, Green, Blue }
 
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface)]
public class ColorAttribute : Attribute
{
       ColorOption m_Color;
       public ColorOption Color
       {
              get
              {
                     return m_Color;
              }
              set
              {
                     m_Color = value;
              }
       }
 
       public ColorAttribute()
{
       Color = ColorOption.Red;
}
public ColorAttribute(ColorOption color)
{
       this.Color = color;
}
}
 
使用ColorAttribute自定义属性的例子:
使用默认构造函数
[Color]
public class MyClass1 {}
使用参数化构造函数
[Color(ColorOption.Green)]
public class MyClass2 {}
使用属性
[Color(Color=ColorOption.Blue)]
public class MyClass3 {}
在接口上使用
[Color]
public interface IMyInterface {}
 
AttributeUsageAttribute的定义:
public sealed class AttributeUsageAttribute : Attribute
{
       public AttributeUsageAttribute(AttributeTargets validOn);
       public bool AllowMultiple { get; set; }
       /* 其他成员 */
}
 
AttributeTargets枚举,指出这种属性可以在哪些类型上使用
另一个属性是AllowMultiple, 默认情况下,AllowMultiple的设置为false,你只能为每个类或接口使用一次属性,如果明确地设置AllowMultiple为true,你就能为同一个目标多次使用同一属性
 
反射自定义属性
示例:反射自定义属性
public static ColorOption GetColor(object obj)
{
       Type objType = obj.GetType();
       Debug.Assert(objType.IsClass || objType.IsInterface);
 
       Type attribute = typeof(ColorAttribute);
 
       object[] attributeArray = objType.GetCustomAttributes(attribType, true);
 
       //最多只有一个color属性
       Debug.Assert(attributeArray.Length == 0 || attributeArray.Length == 1);
 
       if (attributeArray.Length == 0)
       {
              return ColorOption.Red;
}
 
ColorAttribute colorAttribute = (ColorAttribute)attributeArray[0];
return colorAttribute.Color;
}
 
C# 反射与属性的深入探索 本文深入探讨了C#中反射和属性的使用,通过反射API获取类型信息,介绍了如何利用反射获取和设置属性、方法和构造函数等成员的详细信息。同时,文章也详细讲解了属性的定义、使用以及如何创建自定义属性,包括如何使用属性来扩展C#语言的自我扩展性。 阅读详情

相关推荐

深入理解C#中的反射与属性

本文深入探讨了C#中的反射和属性两个核心概念。首先,介绍了反射的基本原理和使用方法,以及如何通过反射获取类、方法、属性等成员信息。接着,文章详细阐释了属性的定义、使用场景以及如何通过自定义属性来扩展C#语言。最后,通过具体代码示例,展示了如何利用反射和属性来实现程序的动态性和可扩展性。

weixin_42509507的博客 312

反射和属性

•反射的概念 •反射遍历成员 •用射调用类型成员 •属性概念(Attribute) •属性的实例 •自定议属性 •三个属性 二次编辑一次运行 一次编译后 反射 反射是编程的读取与类型相关联的元数据的行为。通读取元数据,可以了解它是什么类型以及类型的成员。比如类中的属性,方法,事件等。 所属命名空间System.Reflection 反射-反射成员名称 类 c...

weixin_30678349的博客 199

自定义属性在C#中的应用与反射

本文深入探讨了C#中的自定义属性,包括属性的定义、使用、以及如何通过反射在运行时获取属性信息。首先介绍了属性的基本概念和参数使用,然后通过示例展示了如何创建和使用自定义属性,并讨论了属性的限制和定义方法。最后,文章通过代码示例展示了如何利用反射技术访问和展示类上关联的属性信息。

weixin_42360846的博客 486

反射(类类&反射实例化&动态方法调用&读写属性)

什么是反射: 反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法反射的用途:类类的获取方式有哪些?1.类.class;2.类实例.getClass();3.Class.forName("类的全路径名"); 方法: getConstructor(公有方法使用)getDeclaredConstructor(私有方法使用) newInstance(实例化)知识点2: * 1.无参数 公有的构造方法 * 2.有参数 公有的构造方法 * 3

qq_66924116的博客 293

深入理解反射与属性在C#中的应用

本文将深入探讨C#中的反射与属性的概念、使用方法和应用场景。通过分析System.Reflection命名空间下的PropertyInfo类的成员以及如何获取类成员信息,我们不仅能够获取类的基本信息,还能深入理解如何在运行时动态获取和操作类的成员。同时,本文还将介绍.NET中的属性(Attributes)的概念,包括如何定义和使用自定义属性,以及属性如何为代码添加元数据,并在运行时通过反射进行查询。

weixin_36431145的博客 330

C#进阶技巧:属性、反射与未来特性

本文深入探讨了C#编程语言中的高级特性,包括属性、反射以及C#未来可能引入的新特性。通过实例和练习,读者将学习如何创建自定义属性,如何使用反射在运行时查询程序信息,以及对泛型、迭代器等的简要介绍。最后,文章强调了通过编写程序来实践所学知识的重要性,并鼓励分享代码以获取反馈和帮助他人。

weixin_42509507的博客 299

通过反射获取类的属性与方法【Java】

通过反射来获取属性与方法

qq_56402474的博客 9927

银河麒麟服务器操作系统V10SP2实战:基于vsftpd构建多角色精细化权限FTP服务

本文详细介绍了在银河麒麟服务器操作系统V10SP2上基于vsftpd构建多角色精细化权限FTP服务的实战指南。从环境准备、核心配置到多角色用户权限管理,全面解析了FTP服务的部署与优化技巧,特别针对企业级应用场景提供了安全加固和故障排查方案。

weixin_30312563的博客 357

C# 反射 (Reflection) 的常用功能

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

熊思雨的博客 3686

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。

weixin_42525551的博客 1085

团队管理中最棘手的6个问题

研发团队的管理棘手问题,大多集中在。

xiaolyuh的专栏 742

反射属性,以及反编译

1、反射属性 /* * 反射属性Field * */ public class ReflectTest5 { public static void main(String[] args) throws Exception{ Class studentClass = Class.forName("com.bean.Student"); String stucls = studentClass.getName(); System.out.printl.

qq_37203178的博客 304

知识见闻 - Salesforce公司发展史

不过,通过将自己开发的产品与公司收购的其它云产品进行结合,Salesforce可以为用户提供更多的产品种类,Salesforce可以继续强化自己的平台和产品套件属性,这一平台和套件的发展规模已经远远超出了一个单一的CRM的规模。他们围绕一个相对简单的产品向用户兜售云的概念,然后,他们开始开发其它产品,并寻找培育一个不断增长的生态系统的方法,最理想的情况是能驱动Salesforce的营收增长。现在,Salesforce通过打造更多的用例并改进自己产品的方式来直接应对竞争对手的竞争,从而捍卫自己现在的地位。

guoqx的专栏 1449

java 反射得到属性与属性值

反射可以破坏所有的封装性,比如这次通过反射得到的属性与属性值; /** * 得到属性值 * @param obj */ public static void readAttributeValue(Object obj){ String nameVlues=""; //得到class C...

AinUser的博客 419

Datalog语言详解

Datalog是一种声明式逻辑编程语言,起源于数据库理论和逻辑编程领域。作为Prolog的子集,它专注于递归查询和推理,通过定义事实和规则来描述数据关系而非计算步骤。Datalog的关键特性包括规则安全、递归、分层否定和扩展聚合功能,保证了程序的终止性和高效性。相较于SQL,Datalog更擅长处理递归查询;相比Prolog,它更注重数据库友好性。Datalog在程序分析、知识图谱、网络安全等领域有广泛应用,其声明式特性使代码简洁易维护,但同时也面临生态系统小、性能调试难等挑战。现代工具如Soufflé、D

bulita great world 1843

安川机器人SOCKET 通讯

命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...

记录学习内容 8285

浅谈反射与属性

  反射是编程的读取与类型相关联的元数据的行为,通过元数据,你能了解它是什么类型以及它是由什么构成的(方法、属性、基类)。  反射服务在system.Reflection命名空间中定义,它在和属性一起使用时最有用。属性是一种向类型添加信息并影响类型行为的方法。  反射还允许在运行期间定义新类型,并生成相应的IL代码和元数据(使用在System.Reflection.Emit命名空间中的各种服务。S

TonyWang的专栏 892

OpenClaw-遇到的问题-Health check failed: gateway closed (1006 abnormal closure (no close frame)): no clos

OpenClaw网关服务安装成功但运行异常,显示健康检查失败(错误代码1006)。系统提供了Web控制界面(http://127.0.0.1:18789/)和带令牌的安全访问链接。文档建议参考故障排除指南,并提供了可选应用扩展功能(包括移动端支持)。注意运行本地代理存在安全风险,建议加固系统配置。若需启用网络搜索功能,需配置Brave搜索API密钥。安装完成后会自动打开仪表盘,需保持浏览器标签页以控制OpenClaw服务。

直到世界的尽头 1万+

.net的反射与属性

搞了一天,TMD在网上搜了一天,没有一个具体的总结,要么都是相互抄袭,气死我也,同时也恨自己啊! 现在将我总结反射与属性的应用分享给我的朋友....... 什么是属性(不是字段什么年龄,性别这些)?

万花筒 邪灵噶 的博客 1281

YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例

本文记录的是基于SimAM注意力模块的YOLOv11目标检测方法研究。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。

Limiiiing的博客 9036

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Qt 反射机制与动态属性系统

反射机制允许在运行时获取类信息、调用方法和访问属性动态属性系统支持在运行时动态添加和管理对象属性两者结合可实现高度灵活的系统,如插件架构、动态配置和数据绑定通过合理使用这些特性,可以在保持代码简洁的同时,显著提升应用的可扩展性和适应性。

编程与实战的博客 667

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

反射的三种获取方式,反射获取构造器与实例化,通过反射获取属性并修改值,通过反射获取方法

反射 1:类对象和它的三种获取方式 1.1 通过对象.getClass()方法 //能直接得到这个类的对象,就可以使用这种方法来通过对象获取 Person p = new Person(); Class cls1 = p.getClass(); 1.2.通过类名.class 来获取字节码对象 //当前类与这个类在一块(同包),可以使用这种方法 Person p = new Person(); Cl...

Data_H的博客 1050

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

通过反射获取类中的所有属性与方法

获取公共属性 //可以随意用四种类加载方式的任意一种获取类对象 实体类 s=new 实体类(); Class c=s.getClass(); //通过类对象获取单个属性 Field f=c.getFiled("属性名");//f为当前指定类属性的file属性 //给对象属性赋值 f.set(s,"值"); //获取属性值 f.get(s); 获取私有属性 实体类 s=new...

D1206的博客 1万+
上一篇: How to call c++ exported method and classes in c#
下一篇: 异常规范
RedRiver331
博客等级 码龄24年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值