首页 > 编程语言 >[个人笔记][C#]反射和特性学习笔记

[个人笔记][C#]反射和特性学习笔记

时间:2023-09-04 18:23:26浏览次数:45  
标签:反射 obj C# 特性 实例 笔记 类型 Type typeof

反射

  • 通过Type类型的实例来访问类型的元数据
  • 通过obj.GetType()typeof()获取一个Type类型的实例
  • 在Type类型的实例上通过GetProperties()GetMethods()GetCustomAttributes()访问类型的各种东西
  • GetType()只能在实例上调用,typeof()给一个类型名就行,它是在编译时求值的
  • 验证一个对象的类型是否是某个类型:
bool CompareTo(object obj)
{
    //反射写法
    if (obj.GetType() != typeof(DateTime))
    {
        //
    }

    //is
    if (obj is DateTime)
    {
        //
    }
    //我觉得这俩是一个意思
}
  • 我记得以前看CLR via C#的时候说过,运行时会为每一个类型创建一个唯一的Type对象,然后每一个该类型的实例都会有一个指针,指向这个Type对象,所以判断一个实例是否是某个类型的这个功能,底层应该就是判断这个实例里存储的指针是否等于给定的类型的类型对象的指针
  • 获取到一个PropertyInfo之后可以直接SetValue,传值和要设置的对象的引用就行
  • 获取到一个MethodInfo之后可以直接Invoke
  • IsGenericType判断是否是泛型类型,GetGenericArguments()获取泛型参数的Type

nameof

  • 编译时获取一个程序元素的名字,如果是完全限定名也只获取最后一个标识符

特性

  • 可以利用特性指定与被修饰的构造有关的额外元数据,特性的作用是将额外的数据关联到某个程序元素上
  • 返回值的特性需要加一个return:
  • .csproj文件中的<PropertyGroup>里的元素,都会注入为[assembly:]特性
  • 自定义特性继承Attribute,结尾加个Attribute
  • 给特性加构造函数,在特性对象里存数据
  • 只有常量值和typeof表达式才允许作为实参传到构造函数
  • 如果特性有必须的属性值,要提供只读属性
  • 提供相应的构造函数来初始化属性
  • AttributeUsageAttribute特性用于自定义特性的时候添加一些限制
    • 第一个参数指定该特性可以修饰什么类型的元素,使用不恰当时会编译错误
    • AllowMultiple限制是否可以在一个构造上添加多次
  • FlagAttribute需要指定每个枚举项的值,1<<01<<1
  • AttributeUsage是编译器内建支持的
  • Conditional可以条件执行某些方法,用define定义宏,是否调用取决于调用者所在程序集中的预处理器标识符,因为他是靠编译器删掉调用代码来实现的
  • Obsolete用于将一个东西标记为作废的,可以添加额外的message和bool error来指定是否强制编译器报错

标签:反射,obj,C#,特性,实例,笔记,类型,Type,typeof
From: https://www.cnblogs.com/m1ds/p/17677545.html

相关文章

  • win2016系统php7.4安装oracle oci8扩展
    查看php版本,判断操作系统是否64位;phpinfo();判断PHP是否TS查看ThreadSafety的值,如果是disabled就是NTS,否则是TS,下载的时候要区分;下载扩展oci82.2.0forWindows:https://pecl.php.net/package/oci8/2.2.0/windows下载并解压,把php_oci8.dll,php_oci8_11g.dll,php_oci8_12c......
  • 配置iSCSI存储
    【更新】【WindowsServer2019】存储服务器的配置和管理——iSCSI的安装和配置(上)_windows搭建iscsi服务器_NOWSHUT的博客-CSDN博客【WindowsServer2019】存储服务器的配置和管理——iSCSI的安装和配置(下)_win10搭建iscsi服务端_NOWSHUT的博客-CSDN博客......
  • ChatGLM2 源码解析:`GLMTransformer`
    #编码器模块,包含所有GLM块classGLMTransformer(torch.nn.Module):"""Transformerclass."""def__init__(self,config:ChatGLMConfig,device=None):super(GLMTransformer,self).__init__()self.fp32_residual_co......
  • 学习CAE软件有什么方法技巧?
    在工程设计和制造领域,计算机辅助工程(CAE)软件已经成为不可或缺的工具。然而,学习使用这类复杂软件需要投入大量时间和精力。为了帮助您更快地掌握CAE软件,本文将分享一些高效的学习方法与技巧。   明确学习目标在开始学习之前,明确您的学习目标非常重要。您希望掌握哪些技能?您......
  • 重启rc.local没执行解决方法
    背景:在早期的SysVinit系统中,/etc/rc.local是在所有其他init脚本执行完毕后自动执行的一个脚本,为系统管理员提供了一个在系统启动时运行自定义命令的便捷方法。随着systemd成为许多主流Linux发行版的默认init系统,因为systemd使用服务单位(unitfiles)来控制启动进程,而......
  • ChatGLM2 源码解析:`MLP`
    classMLP(torch.nn.Module):"""MLP.MLPwilltaketheinputwithhhiddenstate,projectitto4*hhiddendimension,performnonlineartransformation,andprojectthestatebackintohhiddendimension.""&quo......
  • csgo如何显示帧数(含代码示例)
    CSGO可以通过控制台命令来显示帧数,代码如下:打开CSGO游戏,按下“~”键打开控制台;CSGO可以通过控制台命令来显示帧数,代码如下:1.打开CSGO游戏,按下“~”键打开控制台;2.在控制台输入“cl_showfps1”,即可开启帧数显示;3.若要关闭帧数显示,只需在控制台输入“cl_showfps0”即可。......
  • Consul原理介绍
    官方文档:https://www.consul.io/docsRaft动画演示:http://thesecretlivesofdata.com/raft/注册中心对比Consul特点服务发现、健康检查、Key/Value存储、安全服务通信(TLS证书)、多数据中心架构角色数据中心数据中心内,Client和Server通过LANGosssip进行通信,同步集群节点信息,其保障......
  • 【 LeetCode题解 】203. 移除链表元素
    【LeetCode题解】203.移除链表元素题目链接:https://leetcode.cn/problems/remove-linked-list-elements/博客主页链接:DuckBro博客主页关注博主,后期持续更新系列文章***感谢观看,希望对你有所帮助***目录【LeetCode题解】203.移除链表元素......
  • JavaScript用indexOf()在字符串数组中查找子串时需要注意的一个地方
    一、遇到问题在 继续更新完善:C++结构体代码转MASM32代码 中,由于结构体成员中可能为数组类型的情况,因此我们在提取结构体成员信息的过程中,需要检测结构体成员名称字符串中是否包括[],如果包括那么我们要截取'['前面的内容作为成员名称。在用字符串的indexOf()方法检测和定位'['......