当前位置: 首页 > news >正文

C#根据反射操作对象

前言

反射使用,让我们的程序可以动态增加一些功能,让原本固化的步骤逻辑变得动态,这是它的优点。当然使用反射首次加载会有性能损耗以及使用复杂;但是现在大家都在讲动态,使用好它应该是一个重要的编程理念提升。MVC、ORM、IOC、AOPA都有使用这个东西了。如果要考虑性能,可以考虑缓存程序集,我们保证程序只加载一次就好。

一、直接利用反射读写对象的值

 static void Main(string[] args){Person p = new Person() { Name = "丁竹", Age = 26, Sex = true };p.Working("readinof");//利用反射读取值object obj = p;var type = obj.GetType();foreach (var item in type.GetProperties()){string value = item.GetValue(obj, null).ToString();Console.WriteLine($"{item.Name} {value}");}Assembly ass = Assembly.Load("ReadInfo");object pObj = ass.CreateInstance("ReadInfo.Person");//利用反射设置值{System.Reflection.PropertyInfo propertyInfo = type.GetProperty("Name");propertyInfo.SetValue(obj, "ding", null);}Console.Read();}

二、通过反射调用实例

 static void Main(string[] args){//[1].CsharpCodePrivode//提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider.//CreateCompiler():获取编译器的实例CSharpCodeProvider objcsharpcodeprivoder = new CSharpCodeProvider();//[2].ICodeComplier//定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。//每种编译方法都接受编译器的ComplierParameter对象,并返回指示编译结果的CompilerResults对象ICodeCompiler codeCompiler = objcsharpcodeprivoder.CreateCompiler();//[3].ComplierParameters 表示用于调用编译器的参数//ReferencedAssembies:获取当前项目所引用的程序集。Add方法为程序集添加引用//GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成Dll,默认是false.//GenerateInMemor:获取或设置一个值,该值指示是否在内存中生成输出。CompilerParameters objcompilerparameters = new CompilerParameters();// objcompilerparameters.ReferencedAssemblies.Add("System.dll");objcompilerparameters.GenerateExecutable = false;objcompilerparameters.GenerateInMemory = true;//[4].CompilerResults 表示从编译器返回的编译结果//CompiedAssembly:获取或设置以编译的程序集,Assembly类型。CompilerResults cr = codeCompiler.CompileAssemblyFromSource(objcompilerparameters, GenerateCode());if (cr.Errors.HasErrors){Console.WriteLine("编译错误:");foreach (CompilerError item in cr.Errors){Console.WriteLine(item.ErrorText);}}else{//通过反馈,调用HelloWorld实例Assembly assembly = cr.CompiledAssembly;object objHelloWorld = assembly.CreateInstance("DynamicCodeGenerate.HelloWorld");MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");Console.WriteLine(objMI.Invoke(objHelloWorld,null));}Console.ReadLine();}static string GenerateCode(){StringBuilder sb = new StringBuilder();sb.Append("using System;");sb.Append(Environment.NewLine);sb.Append("namespace DynamicCodeGenerate");sb.Append(Environment.NewLine);sb.Append("{");sb.Append(Environment.NewLine);sb.Append(" public class HelloWorld");sb.Append(Environment.NewLine);sb.Append(" {");sb.Append(Environment.NewLine);sb.Append(" public string OutPut()");sb.Append(Environment.NewLine);sb.Append(" {");sb.Append(Environment.NewLine);sb.Append(" return \"Hello world!\";");sb.Append(Environment.NewLine);sb.Append(" }");sb.Append(Environment.NewLine);sb.Append(" }");sb.Append(Environment.NewLine);sb.Append(" }");string code = sb.ToString();Console.WriteLine(code);Console.WriteLine();return code;}

三、通过动态加载Dll生成实例

  dom.DoCompileFile(Path.Combine(pathStr, filename), "Test.dll");MySampleDomain = AppDomain.CreateDomain("MySampleDomain");ass = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Test.dll");obj = MySampleDomain.CreateInstanceAndUnwrap(ass.FullName, "Sample.Demo");

四、通过反射调用方法

  Type type = obj.GetType();MethodInfo method = type.GetMethod("Add");int a=Convert.ToInt32( method.Invoke(obj, new object[] { 1,3 }));Console.WriteLine(a);

五、完整代码

public class ReflexHelp{public void Execute(string gencode){//[1].CsharpCodePrivode//提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider.//CreateCompiler():获取编译器的实例CSharpCodeProvider objcsharpcodeprivoder = new CSharpCodeProvider();//[2].ICodeComplier//定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。//每种编译方法都接受编译器的ComplierParameter对象,并返回指示编译结果的CompilerResults对象ICodeCompiler codeCompiler = objcsharpcodeprivoder.CreateCompiler();//[3].ComplierParameters 表示用于调用编译器的参数//ReferencedAssembies:获取当前项目所引用的程序集。Add方法为程序集添加引用//GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成Dll,默认是false.//GenerateInMemor:获取或设置一个值,该值指示是否在内存中生成输出。CompilerParameters objcompilerparameters = new CompilerParameters();// objcompilerparameters.ReferencedAssemblies.Add("System.dll");objcompilerparameters.GenerateExecutable = false;objcompilerparameters.GenerateInMemory = true;//[4].CompilerResults 表示从编译器返回的编译结果//CompiedAssembly:获取或设置以编译的程序集,Assembly类型。CompilerResults cr = codeCompiler.CompileAssemblyFromSource(objcompilerparameters, gencode);if (cr.Errors.HasErrors){Console.WriteLine("编译错误:");foreach (CompilerError item in cr.Errors){Console.WriteLine(item.ErrorText);}}else{//通过反馈,调用HelloWorld实例Assembly assembly = cr.CompiledAssembly;object objHelloWorld = assembly.CreateInstance("DynamicCodeGenerate.HelloWorld");MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");Console.WriteLine(objMI.Invoke(objHelloWorld, null));}}public object GenObject(string dllFileName, string typeName){Assembly ass = Assembly.LoadFile(dllFileName);return ass.CreateInstance(typeName);}public int GetAddInfo(object obj, string methrName){Type type = obj.GetType();MethodInfo method = type.GetMethod(methrName);return Convert.ToInt32(method.Invoke(obj, new object[] { 1, 3 }));}/// <summary>/// 编译代码/// </summary>/// <param name="provider">编译器</param>/// <param name="sourceFile">源文件</param>/// <param name="gentenFile">生成文件名</param>/// <returns>编译结果</returns>public CompilerResults CompileCode(CodeDomProvider provider, string sourceFile, string gentenFile){string[] referenceAssemblies = { "System.dll" };CompilerParameters cp = new CompilerParameters(referenceAssemblies, gentenFile, false);cp.GenerateExecutable = false;//设置是否要包含一个入口点CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);return cr;}}

相关文章:

C#根据反射操作对象

前言 反射使用&#xff0c;让我们的程序可以动态增加一些功能&#xff0c;让原本固化的步骤逻辑变得动态&#xff0c;这是它的优点。当然使用反射首次加载会有性能损耗以及使用复杂&#xff1b;但是现在大家都在讲动态&#xff0c;使用好它应该是一个重要的编程理念提升。MVC、…...

打包python脚本(flask、jinja2)为exe文件

20240803 概述 在我很早时候学习python的时候&#xff0c;就利用过某个工具将其打包为exe文件&#xff0c;然后在没有python环境的机器上运行&#xff0c;这样可以减少安装python环境和各种库的过程。 最近在开发一个在虚拟机上运行的程序的时候就遇到了打包一些环境的问题&…...

嵌入式初学-C语言-练习三

#部分题目可能在之前的博客中有&#xff0c;请谅解&#xff0c;保证常见题型均被发出# 1.计算n以内所有正奇数的和 ? n值通过键盘输入 代码&#xff1a; 1 /*2 需求&#xff1a;计算n以内所有正奇数的和 ? n值通过键盘输入3 */4 #include <stdio.h>5 6 int main()7 …...

最新版Sonible Plugins Bundle v2024 winmac,简单智能,持续更新长期有效

一。Sonible Plugins Bundle v2024 win&mac Sonible Plugins Bundle是一款以创作者为中心的智能音频插件系列。这些工具的特点是易于使用&#xff0c;搭配高级处理和优质音质。pure:bundle的所有插件都由sonible的智能插件系列中使用的技术驱动&#xff0c;但在设计时考虑到…...

J032_实现简易版的B/S架构

一、需求描述 实现简易版的B/S架构 1.1 Server package com.itheima.tcp4;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.uti…...

【前端面试】五、框架

目录 1 Vue2 2 Vue3 3 React 4 Angular 1 Vue2 Vue2 是目前仍被广泛使用的前端框架之一&#xff0c;其特点包括响应式数据绑定、组件化开发等。 响应式系统&#xff1a;Vue2 使用 Object.defineProperty 来实现数据的响应式。每个组件实例在创建时&#xff0c;会将 dat…...

C语言 | Leetcode C语言题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; char* removeDuplicateLetters(char* s) {int vis[26], num[26];memset(vis, 0, sizeof(vis));memset(num, 0, sizeof(num));int n strlen(s);for (int i 0; i < n; i) {num[s[i] - a];}char* stk malloc(sizeof(char) * 27);int stk…...

本地部署 Llama-3-EvoVLM-JP-v2

本地部署 Llama-3-EvoVLM-JP-v2 0. 引言1. 关于 Llama-3-EvoVLM-JP-v22. 本地部署2-0. 克隆代码2-1. 安装依赖模块2-2. 创建 Web UI2-3.启动 Web UI2-4. 访问 Web UI 0. 引言 Sakana AI 提出了一种称为进化模型合并的方法&#xff0c;并使用该方法创建大规模语言模型&#xff…...

Evaluating the Generation Capabilities of Large Chinese Language Models

文章目录 题目摘要相关工作CG-Eval实验 题目 评估大型中文语言模型的生成能力 论文地址&#xff1a;https://arxiv.org/abs/2308.04823 项目地址&#xff1a;http://cgeval.besteasy.com/ 摘要 本文介绍了 CG-Eval&#xff0c;这是有史以来第一个全面的自动化评估框架&#xf…...

YOLOv8添加注意力模块并测试和训练

YOLOv8添加注意力模块并测试和训练 参考bilibili视频 yolov8代码库中写好了注意力模块&#xff0c;但是yolov8的yaml文件中并没用使用它&#xff0c;如下图的通道注意力和空间注意力以及两者的结合CBAM&#xff0c;打开conv.py文件可以看到&#xff0c;其中包含了各种卷积块的…...

「Unity3D」自动布局LayoutElement、ContentSizeFitter、AspectRatioFitter、GridLayoutGroup

布局元素与布局控制器 布局元素实现ILayoutElement接口&#xff0c;布局控制器实现ILayoutController接口&#xff0c;后者根据前者的属性控制具体布局——有些布局控制器也是布局元素&#xff0c;即同时实现这两个接口&#xff0c;如LayoutGroup。 public interface ILayout…...

【Golang 面试 - 进阶题】每日 3 题(十六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

Redis2

为什么Redis要给缓存数据设置过期时间&#xff1f; 内存是有限的&#xff0c;如果缓存中的所有数据都是一直保存&#xff0c;很容易OOM Redis如何判断数据是否过期&#xff1f; 通过过期字典来保存数据的过期时间 过期删除策略 Redis采用的是定期删除惰性删除 Redis内存淘…...

C语言--函数

1. 函数定义 语法&#xff1a; 类型标识符 函数名&#xff08;形式参数&#xff09; {函数体代码 } &#xff08;1&#xff09;类型标识符 --- 数据类型&#xff08;函数要带出的结果的类型&#xff09; 注&#xff1a;数组类型不能做函数返回结果的类型&#xff0c;如果函…...

Shell 编程的高级技巧和实战应用

第一步&#xff1a;高级函数和模块化设计 1.1 高级函数设计 探讨函数的参数处理和默认值设置。示例&#xff1a;实现一个可以处理可选参数的函数。 #!/bin/bashgreet() {local name${1:-"World"} # 如果没有提供参数&#xff0c;使用默认值 "World"ech…...

VMWare虚拟机如何连接U盘

检查配置 1&#xff09;Win R键&#xff0c;输入services.msc&#xff0c;打开服务。 2&#xff09;将AMware USB Arbitration Services 服务开启&#xff0c;并设置为自动启动&#xff1b; 连接U盘 目前作者了解有两种连接方式&#xff0c;如有其他连接方式&#xff0c;欢…...

【学习笔记】后缀自动机(SAM)

前言 之前对后缀自动机的理解太浅薄了&#xff0c;故打算重新写一篇。 后缀自动机是什么 后缀自动机是一个字符串的所有后缀建起来的自动机。它把所有子串&#xff08;后缀的前缀&#xff09;用 O ( n ) O(n) O(n) 的空间装了起来。后缀自动机的边会构成一个 D A G DAG DA…...

Godot的节点与场景

要深入的理解节点与场景&#xff0c;我们需要跳出这两个概念来看他。说的再直白一些godot本质就是一个场景编辑器&#xff01; 场景的概念应该在我们平时看电影看电视时会经常提到&#xff0c;比如某一个打斗的场景&#xff0c;这个场景可能会被设在某一个街道&#xff0c;那么…...

C++ 学习(2) ---- std::cout 格式化输出

目录 std::cout 格式化输出简介使用成员函数使用流操作算子 std::cout 格式化输出简介 C 通常使用cout输出数据&#xff0c;和printf()函数相比&#xff0c;cout实现格式化输出数据的方式更加多样化&#xff1b; 一方面&#xff0c;cout 作为 ostream 类的对象&#xff0c;该类…...

前端拿不到Long类型成员变量,用@JsonSerialize(using = ToStringSerializer.class)序列化一下

EqualsAndHashCode(callSuper true) Data TableName("la_school_business") Schema(description "商务负责人表") public class SchoolBusiness extends BaseEntity {private static final long serialVersionUID -7124481085999629236L;/*** 商务负责人…...

手把手教你用Dockerfile为Ubuntu 18.04镜像定制Python+OpenCV开发环境

从零构建PythonOpenCV的Docker开发环境&#xff1a;最佳实践指南 在计算机视觉和机器学习项目中&#xff0c;一个标准化、可复现的开发环境至关重要。Docker作为容器化技术的代表&#xff0c;能够完美解决"在我机器上能跑"的经典难题。本文将手把手教你如何基于Ubunt…...

从“三次握手”到文件落地:用Wireshark抓包带你彻底搞懂C++ Socket文件传输全过程

从“三次握手”到文件落地&#xff1a;用Wireshark抓包带你彻底搞懂C Socket文件传输全过程 当你在浏览器下载文件时&#xff0c;是否好奇过数据是如何跨越网络准确无误地到达你的电脑&#xff1f;本文将带你用C实现一个完整的TCP文件传输程序&#xff0c;并通过Wireshark抓包工…...

IT运维监控/可观测性

?? 前言&#xff1a;为什么选择 OpenClaw 对接企业微信&#xff1f; 在2026年的企业数字化办公浪潮中&#xff0c;OpenClaw&#xff08;曾用名 Clawdbot、Moltbot&#xff09;已成长为国内领先的开源AI自动化代理工具。凭借其“自然语言驱动、插件化拓展、多平台无缝集成”的…...

告别代码噩梦:用Awesome-Dify-Workflow零代码30分钟实现企业级登录系统

告别代码噩梦&#xff1a;用Awesome-Dify-Workflow零代码30分钟实现企业级登录系统 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/…...

OpenClaw:AI 权限治理的核心问题

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...

Jieba分词实战:5分钟搞定中文文本词频统计(附完整代码)

Jieba分词实战&#xff1a;5分钟搞定中文文本词频统计&#xff08;附完整代码&#xff09; 中文文本处理是自然语言处理&#xff08;NLP&#xff09;的基础环节&#xff0c;而分词则是中文文本处理的第一步。不同于英文等空格分隔的语言&#xff0c;中文文本需要专门的工具进行…...

【Matlab】MATLAB教程:数据插值interp1(案例:interp1(x,y,xi,‘linear‘);应用:数据补全、插值)

MATLAB教程:数据插值interp1(案例:interp1(x,y,xi,linear);应用:数据补全、插值) 在科研实验、工程监测、信号采集等各类数据获取场景中,受限于设备精度、测试条件、环境干扰等因素,采集到的原始数据往往存在**数据点稀疏、采样间隔不均、局部数据缺失**等问题,直接使…...

后端/全栈/架构师转战AI大模型开发:可落地规划(建议收藏)

如果你本身是后端、全栈或架构师出身&#xff0c;就意味着你已经手握一套扎实的“确定性系统”构建能力——分布式部署、高并发处理、数据库事务管控、系统稳定性保障&#xff0c;这些都是你转型AI大模型开发的核心底牌&#xff0c;也是纯算法出身从业者难以快速补齐的短板。 而…...

OpenClaw技能扩展指南:为百川2-13B添加公众号发布模块

OpenClaw技能扩展指南&#xff1a;为百川2-13B添加公众号发布模块 1. 为什么需要公众号发布技能 上周我正忙着准备一篇技术分享文章&#xff0c;突然意识到一个痛点&#xff1a;每次写完Markdown文档后&#xff0c;手动复制到公众号编辑器、调整格式、上传封面、设置摘要的过…...

示波器安全操作与高压测量实践指南

示波器安全使用指南&#xff1a;从基础操作到高压测量实践1. 示波器使用安全概述示波器作为电子工程师的核心调试工具&#xff0c;其正确使用直接关系到测量结果的准确性和操作人员的人身安全。在实际工程应用中&#xff0c;约35%的测量事故源于不规范的示波器操作&#xff0c;…...