C# 反射基础

1 在.NET中程序集是什么?

程序集(Assembly)以可执行文件(.exe)或动态链接库文件(.dll)的形式存在,是.NET应用程序构建的基本单元。程序集可用于部署、版本控制和设置安全权限等。

2.程序集的有哪些部分组成?

程序集(Assembly)是一个包含清单类型元数据CLR代码资源的文件。

清单

  • 程序集名称信息(包括简单名称FullName、版本号(AssemblyName.Version)、本地化信息(AssemblyName.CultureInfo)和公钥(AssemblyName.GetPublicKeyToken()));
  • 本程序集引用的其他程序集的列表(AssemblyName.GetReferencedAssemblies())
  • 组成程序集的文件列表
  • 一个表明某个类型在哪个程序集的地图

类型元数据

类型元数据(Type Metadata)是指描述类型的数据,它包含了类型的所有成员信息,例如类型的名称、基类、实现的接口、定义的方法、属性、事件、字段以及嵌套类型等。

类型元数据在编译时由编译器收集,并在运行时由.NET运行时使用,以便于进行类型检查、反射、动态调度等操作。

通过调用AssemblyName.GetTypes()可获取程序集所有的类型元数据

using System;
using System.Reflection;class Program
{static void Main(){// 获取当前程序集Assembly assembly = Assembly.GetExecutingAssembly();// 获取程序集中的所有类型Type[] types = assembly.GetTypes();// 输出类型信息Console.WriteLine("程序集中的类型数量: " + types.Length);foreach (Type type in types){Console.WriteLine("类型名称: " + type.Name);Console.WriteLine("类型全名: " + type.FullName);Console.WriteLine("类型所在的程序集: " + type.Assembly.FullName);Console.WriteLine();}}
}

CIL 代码
程序集不包含本机代码,而是包含公共中间语言(CIL)代码。程序的CIL直到被调用运行时才会被即时编译器(JIT)编译成本机代码。

资源
资源部分是可选的,可以包括图形和语言资源。

3. 什么是反射?

反射(reflection)是运行中的程序查看自身或者外部程序集的元数据的行为

4. 反射的作用是什么?

  • 类型检查:通过反射,可以在运行时获取类型信息,包括类型的名称、方法、属性、字段等
  • 动态实例化:使用反射可以动态地创建对象实例,即使编译器在编译时不知道这些类型
  • 调用方法:反射允许动态调用方法,这意味着可以在运行时决定调用哪个方法,而不是在编译时就确定下来。
  • 属性访问:可以通过反射来读取或设置对象的公共或私有属性值。
  • 事件处理:反射还可以用来绑定事件处理方法,这在某些动态事件处理场景中非常有用。

5. 什么是特性?

特性(Attributes)是一种特殊的类,它用于为程序中的其他程序结构(如类、方法、字段等)提供附加信息。

6. 为什么特性的使用往往需要反射?

因为,反射(reflection)是运行中的程序查看自身或者外部程序集的元数据的行为

且,特性(reflection)的生产过程如下:

  • 在源代码中将特性应用于目标程序结构;
  • 编译器在编译时从特性产生元数据,然后把元数据放到程序集中;

所以,可以通过反射获取特性的元数据,从而获取特性为目标程序结构附加的额外信息。

7. 为什么反射运行效率更低?

反射的运行效率通常低于直接代码执行,这是因为反射涉及到了动态解析类型信息和调用,而这些操作通常比静态编译的代码要慢。

具体来说,以下是导致反射效率较低的几个原因:

  • 动态解析:反射需要在运行时动态地解析类型信息,包括查找方法、属性和字段等。这个过程涉及到了字符串比较、字典查找等操作,相对于直接访问静态类型信息来说,这些动态操作会更加耗时;
  • 中间代码(IL)生成:反射调用方法时,需要动态生成中间代码(Intermediate Language,IL),这一过程比直接执行已经编译成中间代码的方法要慢.

8. 怎么在WPF中使用ValidationAttribute特性?

ValidationAttribute用于验证数据模型的属性值是否符合要求。

  1. 首先,创建一个自定义的ValidationAttribute类,继承自ValidationAttribute类,并重写IsValid方法;
using System.ComponentModel.DataAnnotations;public class NotEmptyStringAttribute : ValidationAttribute
{protected override ValidationResult IsValid(object value, ValidationContext validationContext){if (value == null || string.IsNullOrEmpty(value.ToString())){return new ValidationResult("不能为空");}return ValidationResult.Success;}
}
  1. 然后,在数据模型中使用这个自定义的验证器;
public class User
{[NotEmptyString]public string Name { get; set; }
}
  1. 最后,在XAML中使用数据绑定和验证
<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp1"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /><Button Content="提交" Command="{Binding SubmitCommand}" /></StackPanel></Grid>
</Window>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity UGUI透明区域点击无效

是这样的&#xff0c;我有一张图&#xff0c;客户给的是1920*1080&#xff0c;但只有中间部分是按钮&#xff0c;是有效像素。为了让空白区域点击无效。需要设置如下 并且加上下面这句 this.GetComponent<Image>().alphaHitTestMinimumThreshold 0.1f;

tomcat中Pipeline-Valve解析

tomcat中用到Pipeline-Value有二种方式&#xff0c;一种是管道/阀门&#xff0c;另一种是过滤器链/过滤器。 管道/阀门过滤器链/过滤器管道&#xff08;Pipeline&#xff09;过滤器链&#xff08;FilterChain&#xff09;阀门&#xff08;Valve&#xff09;过滤器&#xff08;…

python学习笔记B-08:序列结构之列表--列表的遍历操作

列表的遍历方法主要有三种&#xff0c;使用方法和特点如下&#xff1a; lst list("hello") print("第一种遍历方式&#xff0c;使用for循环&#xff0c;循环变量item直接就是lst中的元素") for item in lst:print(item,end"\t")print("\n…

LeetCode 383.赎金信(模拟,for(char c : 容器)的使用)

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…

第64天:服务攻防-框架安全CVE复现Apache ShiroApache Solr

目录 思维导图 案例一&#xff1a;Apache Shiro-组件框架安全 shiro反序列化 cve_2016_4437 CVE-2020-17523 CVE-2020-1957 案例二&#xff1a;Apache Solr-组件框架安全 远程命令执行 RCE&#xff08;CVE-2017-12629&#xff09; 任意文件读取 AND 命令执行&#xff08…

【java】(软考)面向对象---责任链解析

目录 责任链的意义 手写笔记 ​编辑 责任链的意义 当您把请求给出时&#xff0c;如果某对象不能实现您的操作&#xff0c;责任链会自动把您的请求传给它的下一级 从而避免请求的发送者和接受者之间的耦合关系 这里以2007年下半年试题七进行说明 题目描述 某企业的采购审批…

SpringBoot学习之Kafka下载安装和启动(三十三)

一、Mac环境 1、下载Kafka&#xff1a;Apache Kafka 2、这里我选择的版本是kafka_2.12-3.7.0&#xff0c;下载最新版的Kafka二进制文件&#xff0c;解压到你喜欢的目录&#xff08;建议目录不要带中文&#xff09;。 3、启动ZooKeeper服务&#xff0c;Kafka需要使用ZooKeeper&…

OpenHarmony 网络管理-Socket连接

介绍 本示例主要演示了Socket在网络通信方面的应用&#xff0c;展示了Socket在两端设备的连接验证、聊天通信方面的应用。 效果预览 使用说明 1.搭建服务器环境&#xff1a;修改服务器脚本中的服务端IP地址&#xff0c;与本机IP地址保持一致&#xff0c;修改完成后双击运行脚…

Zynq 7000 系列中的JTAG和DAP子系统

Zynq 7000系列SoC器件通过标准JTAG调试接口提供调试访问。在内部&#xff0c;SoC设备器件在处理系统&#xff08;PS&#xff09;内部实现了一个Arm调试访问端口&#xff08;DAP&#xff09;&#xff0c;同时在可编程逻辑&#xff08;PL&#xff09;内部实现了一个标准的JTAG测试…

minio如何配置防盗链

MinIO 是一个开源的对象存储服务器&#xff0c;用于存储大量的数据&#xff0c;同时提供了丰富的功能和 API。配置防盗链可以帮助你控制谁可以访问存储在 MinIO 上的对象。以下是在 MinIO 中配置防盗链的一般步骤&#xff1a; 编辑 config.json 文件&#xff1a; 找到 MinIO 服…

每日昨日之螺旋矩阵

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;…

文心一言 VS 讯飞星火 VS chatgpt (241)-- 算法导论17.3 7题

七、为动态整数多重集 S (允许包含重复值)设计一种数据结构&#xff0c;支持如下两个操作&#xff1a;① INSERT(S,x) 将 x 插入 S 中&#xff1b;② DELETE-LARGER-HALF(S) 将最大的 ⌈|S|/2⌉ 个元素从S中删除。解释如何实现这种数据结构&#xff0c;使得任意 m 个 INSERT 和…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

sublime运行编译C和Java

1.先安装终端 参照以下教程 如何在 Sublime 文本编辑器中使用终端&#xff1f;_sublime终端窗口怎么打开-CSDN博客 可能遇到的问题&#xff1a;有些sublime text3可能并没有显示“package control”。这个问题对于笔者来说是有些吊诡的&#xff0c;因为之前一开始安装时是能…

nginx容器化方案预研

一、概述 目前 nginx迁移升级不方便,且生产环境没有编译环境,导致生产环境nginx版本过旧、目前存在安全漏洞无法升级。运维建议容器化nginx,因此预研了此容器方案 二、镜像制作 基础镜像 cloudservice-alpine-base-v1.tar 2.1 加载基础镜像 docker load -i cloudservic…

C++恶魔轮盘赌(道具版)

家人们&#xff0c;更新了昂&#xff0c;前文&#xff1a;来自阳了个阳C的恶魔轮盘赌无道具版 作为阳了个阳C的好同学&#xff0c;我光荣地揽下了道具版的重担 不多说话&#xff0c;直接上代码 #include<bits/stdc.h> #include<Windows.h> typedef long long ll…

STM32总结

1. Keil5 下载代码和编译代码需要注意的事项 下载代码&#xff1a; 安装包版本&#xff1a;确保选择与目标硬件兼容的Keil版本。工程设置&#xff1a;在下载代码前&#xff0c;检查工程的设置&#xff0c;确认芯片型号、晶振频率等信息是否正确配置。依赖库&#xff1a;确保所…

类和对象-对象特性-成员变量和成员函数分开存储

成员变量和成员函数分开存储 #include <bits/stdc.h> using namespace std; class Person{}; void test01(){Person p;//c编译器会给每个空对象也分配一个字节空间&#xff0c;是为了区分空对象占内存的位置//每个空对象也应该有一个独一无二的内存地址 cout<<si…

每天学习一个Linux命令之basename

每天学习一个Linux命令之basename 简介 在Linux系统中&#xff0c;basename是一个用于获取一个文件名或目录名的基本名称的命令。它可以用来去除路径前缀或者获取文件名的纯粹部分。basename常用于脚本编程和文件处理&#xff0c;非常实用。 基本用法 basename命令的基本语…

创建socket服务端和客户端--通信(简单入门)

目录 服务端(server) 客户端(client) 服务端(server) socket_client.py import socket #用的协议必须是同一个(要不然交流根本听不懂啊) # 1、创建服务器的socket对象 tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2、绑定IP和端口 tcp_server_…