【反射和表达式树实现调用方法】

使用 ANSYS 实现铸造、凝固和熔炼的高级解决方案 凭借其强大的有限元分析 (FEA) 和计算流体动力学 (CFD) 功能,ANSYS 可以准确预测模具内的热和流体流动行为。总之,ANSYS 是铸件凝固和熔化领域的关键工具。其全面的仿真功能、工艺优化功能、材料特性分析和用户友好的界面使其成为旨在创新和改进制造工艺的工程师不可或缺的工具。通过利用 ANSYS,各行各业可以在铸造业务中实现更高的质量、效率和成本效益,从而为先进的制造解决方案铺平道路。ANSYS是一款领先的工程仿真软件,提供强大的功能来建模和优化这些复杂的热过程,从而显著提高生产效率和质量。 阅读详情

现在有这样一个基本类

using System;
namespace ReflectClassAndMethod
{
    public class AController
    {
        public int MyProperty { get; set; }
        public String Get(String str)
        {
            return "AController Get " + str;
        }
        public string Set(string str) => "AController Set " + str;
    }
}

分别用反射和表达式树来实现调用其方法

using System;
using System.Linq.Expressions;
using System.Reflection;

namespace ReflectClassAndMethod
{
    class Program
    {
        static void Main(string[] args)
        {

            while (true)
            {
                String str = Console.ReadLine();
                if (str == "x") break;
                Console.WriteLine(Execute(str));
            }
        }
        static String Execute(String str)
        {
            string[] strArray = str.Split('/');
            ExcuteDetail detail = new ExcuteDetail()
            {
                Controller = strArray[0],
                Method = strArray[1],
                Argument = strArray[2]
            };
            //return detail.ExecuteByReflection();
            return detail.ExecuteByExpression();
        }
    }
    public class ExcuteDetail
    {
        public String Controller { get; set; }
        public String Method { get; set; }
        public String Argument { get; set; }

        /// <summary>
        /// 反射调用
        /// </summary>
        /// <returns></returns>
        public String ExecuteByReflection()
        {
            //命名空间
            string @namespace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
            //获取类型
            Type type = Type.GetType($"{@namespace}.{Controller}Controller");
            if (type != null)
            {
                //构造函数获取对象
                ConstructorInfo constructorInfo = type.GetConstructor(new Type[] { });
                object o = constructorInfo.Invoke(new object[] { });
                AController aController = o as AController;
                //AController aController = (AController)Activator.CreateInstance(type);
                MethodInfo methodInfo = type.GetMethod(Method);
                string result = methodInfo.Invoke(aController, new object[] { Argument }).ToString();
                return result;
            }
            return "";
        }

        /// <summary>
        /// 表达式树
        /// </summary>
        /// <returns></returns>
        public String ExecuteByExpression()
        {
            //命名空间
            string @namespace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
            //获取类型
            Type type = Type.GetType($"{@namespace}.{Controller}Controller");
            MethodInfo methodInfo = type.GetMethod(Method);
            AController aController = (AController)Activator.CreateInstance(type);

            ParameterExpression paramo = Expression.Parameter(type, Controller);
            ParameterExpression parami = Expression.Parameter(typeof(string), "str");
            MethodCallExpression methodCall = Expression.Call(paramo, methodInfo, parami);
            Console.WriteLine(methodCall.ToString());
            Expression expressionLambda = Expression.Lambda(methodCall, paramo, parami);
            Expression<Func<AController, string, string>> lambda = (Expression<Func<AController, string, string>>)expressionLambda;
            Func<AController, string, string> func = lambda.Compile();
            return func?.Invoke(aController, Argument);
        }
    }
}

测试输入:A/Get/hello world
输出
在这里插入图片描述

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二) 软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。 阅读详情

相关推荐

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3217

来给反射调用加加速(1):利用表达式树

众所周知,反射调用,速度很慢,那怎么办?有什么方法提速么? 有啊,这不,我就介绍一下如何利用表达式树来加速反射调用。 那为什么表达式树比反射快呢? 因为,表达式树可以用Emit生成强类型委托。 好吧,让我们看看如何操作: 1. 一定要定义强类型委托,尤其是签名 /// <summary> /// Represents a generic ...

weixin_30572613的博客 160

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

C#属性的讨论

属性 属性中的value,并不是C#中的关键字,而是上下文标记 因为属性最终会映射为get_/set_对,因此,若声明了属性 public int MyProperty { get; set; } 则不能再声明 public int set_MyProperty() public int get_MyProperty() 自动属性 自动属性:public int MyPropert

EEELab的专栏 813

三、使用HM进行简单的视频隐写demo

三、使用HM进行简单的视频隐写前言一、实验环境二、实验思路三、实验过程3.1 提取原始载体3.2 使用LSB隐写算法进行隐写3.3 放回含密载体3.4 提取含密载体3.5 使用LSB提取算法进行比对四、碰到的问题以及解决思路4.1 块的结构体发生变化4.1.1 产生的原因4.1.2 解决方法4.2 一个有趣的现象4.2.1 产生的原因4.3 视频产生较大失真4.3.1 产生的原因4.3.2 解决方法五、总结 前言 在前两篇博客中介绍了基于HEVC/H.265视频编解码器的视频隐写的基本思路,本文将详细记录

杨酬勤的博客 1786

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下)

本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复杂的医疗AI系统解构为Host、MCP Server和标准协议三层,并将各类能力(临床决策、影像分析、合规审计)封装为标准的、可独立演进的Server,我们成功地构建了一个模块化、高内聚、低耦合的系统。

AllenLV的博客 1372

使用表达式树和反射来访问对象属性的性能比较

今天在工作上遇到这么个需求:需要获取对象上所有属性的值,但并事先并不知道对象的类型。 我的第一反应就是使用反射,但是这个操作会进行多次,大量的反射肯定会有性能影响。虽然对我这个项目无关紧要,但我还是选择了另外一种解决方案:构建表达式树,再生成委托,然后将委托缓存在字典里。代码如下: 首先构建表达式树(类似这种形式:'(a) => a.xx'),并生成委托: privat...

weixin_30338743的博客 200

【C++】开源:ncurses终端TUI文本界面库

ncurses配置使用(TUI)

DevFrank的博客 3155

利用表达式树Expression优化反射性能

最近做了一个.Net Core环境下,基于NPOI的Excel导入导出以及Word操作的服务封装,涉及到大量反射操作,在性能优化过程中使用到了表达式树,记录一下。 Excel导入是相对比较麻烦的一块,实现的效果是:调用方只需要定义一个类,只需要标记特性,服务读取Excel=>校验(正则、必填、整数范围、日期、数据库是否存在、数据重复) =>将校验结果返回 => 提供方...

design_in_1988的博客 727

杰理AC695N芯片跑iic接口的oled驱动分享

本文介绍了一个基于IIC接口的0.96寸OLED显示屏驱动程序,适用于SSD1306控制器。驱动采用软件模拟IIC方式,支持字符、数字、字符串、汉字和图片显示,测试平台为杰理AC695N系列芯片。硬件参数包括128×64分辨率,IIC接口(地址0x78),使用IO_PORTA_02(SDA)和IO_PORTA_03(SCL)引脚。驱动包含OLED主文件(oled.c/h)、软件IIC实现(soft_iic.c/h)和字体/图片数据文件(oledfont.h/bmp.h),可通过修改soft_iic.h中的引

qq_42014563的博客 873

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

c#表达式树(CallMethodExpression)调用有参有返回值方法

的泛型类型,以匹配带有两个参数和返回值的 lambda 表达式。最后,我们修改了编译表达式树的过程,以匹配带有两个参数的委托。通过这种方式,我们可以根据方法的参数类型和数量来创建适配的表达式树,从而实现带有参数和返回值的方法调用。C# 中的 MethodCallExpression 用于表示方法调用的表达式树。的参数表达式,并在创建方法调用表达式时传入了这个参数。在这个示例中,我们修改了创建表达式树的过程,以适配具有。

qq_41942413的博客 864

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 141

【C#】表达式树实现对象ToString方法

在开发中,对于经常出现一些数据类,我们常常需要知道它几乎所有字段的值,这时候为了方便,我们都是自己将对象打印到控制台中进行查看,但是如果对象没有重新ToString方法,那我们就只能看到类名,而无法知道它字段的信息,所以需要自己重写ToString方法,但是如果对于某个数据类他的所有子类都有这种需求时,那就会十分麻烦,所以通过代码去动态生成ToString的结果将非常方面后续调试。

qq_42696107的博客 681

廖雪峰Python教程[完整版]

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

BrewUI:用图形化界面终结macOS命令行恐惧,轻松管理Homebrew包

在macOS上安装和管理开发软件,常依赖Homebrew这一包管理器,但密集的命令行输出与终端操作让非技术背景用户望而却步。包管理工具的本质是将软件依赖与安装流程自动化,Homebrew虽强大,却缺少面向普通用户的友好交互层。BrewUI的出现弥补了这一缺口——它作为Homebrew的图形化前端,在后台调用brew命令,将安装、升级、卸载、清理等操作转化为按钮和进度条,同时清晰展示依赖关系与错误信息,让用户无需理解复杂逻辑即可完成日常管理。这一技术价值不仅适用于设计师、运营等非工程师群体,也为间歇性使用命令

weixin_34406086的博客 186

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。...

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Linq.Expressions; namespace INPEXOn...

weixin_33893473的博客 118

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# 使用不适用克隆和 序列化 用表达式树和反射实现深度copy

在不侵入原有实体类实现深度copy

oDanYiNiao的博客 400

三种动态调用方法

早绑定就是在编译期已经确定了类型,编译后代码执行效率很高;晚绑定是在运行期才确定类型。晚绑定需要在运行期确定类型,所以效率比较低,但是带来了很大的灵活性。本人认为动态调用算是晚绑定的具体形式了,也就是不需要头文件和Lib,而调用dll里面的函数。 目前的基于ATL开发的插件体系软件多采用前者,即需要idl编译出的.h和_i.c文件,这种方式有时候比较死板,缺少动态机制。其实采用下面介绍的任何一种

zqf_office的专栏 891

C# 表达式目录树Expression

表达式目录树 表达式目录树:语法树,或者说是一种数据结构 1.表达式目录树Expression:System.Linq.Expressions; 2.描述了多个变量或者和常量之间的关系,按照一定的规则进行组装! 可以向委托一样使用lambd表达式快捷声明; 不能有语句体,声明只能有一行代码; 可以通过Compile(),编译成一个委托; Func<int, int, int> func = (m, n) => { int i = 0; return m * n + 2;

qq_29821795的博客 1010

从基础到实战:.NET 反射机制的进阶用法与最佳实践

反射是 .NET 动态编程的基石,它让程序从“静态执行”走向“灵活扩展”。反射是“非常规操作”,应在必要时使用。优先用缓存和委托优化性能;避免滥用私有成员访问,防止代码脆弱性;高性能场景可结合表达式树或 Source Generator 替代。掌握反射的核心原理和最佳实践,能让你在面对插件系统、依赖注入等复杂场景时,写出既灵活又高效的代码。

VBP_2025的博客 896

C# 泛型 Generics 创建带参对象(取代反射创建对象 优化性能)

需求:使用泛型创建有参数的对象(性能上考虑,不使用反射创建)。 使用泛型创建无参(默认)构造函数的对象可以用 where :T ,new() new T(); 来实现,但是如果构造函数带有参数怎么办呢? 于是就写了一下一段代码: 这里使用了Expression 和 LambdaExpression,目的是为了生成对应类构造函数的委托 ,所以第一次调用会相对慢一点,随后调用就像直接ne...

Ivan Yu 558

读ASP.NET MVC5 框架揭秘有感

前言: 之前一直觉得这本书落伍了,现在都已经.NET Core 3.0时代了,.NET FrameX的时代已经过去了。但是回想一下程序的思路都是相同的,尤其是在我看了.NETcore的部分源码之后惊为天人,原来程序是可以这样设计的。后来了解到老A用200行代码实现了一个Mini版的Core框架看了之后觉得讲的清晰,也随之发现这本书的作者就是老A。想着买一本来拜读奈何已经卖的绝版了,市场上都是二...

weixin_34313182的博客 296

推荐开源项目:SerializableCallback - 为Unity量身打造的动态回调神器

推荐开源项目:SerializableCallback - 为Unity量身打造的动态回调神器 在Unity开发的浩瀚宇宙中,【SerializableCallback】如一颗璀璨明星,以其独特魅力照亮了事件处理和方法调用的新路径。它不仅打破了传统回调机制的束缚,还让开发者在Unity Inspector中轻松拖拽非空返回值或带参数的方法,这一切都变得如同游戏般直观。 项目介绍 Serializa...

gitblog_00712的博客 799

Expression控制台输出

MethodInfo write= typeof(Console).GetMethod(“Write”, BindingFlags.Static | BindingFlags.Public,null, new Type[]{typeof(bool)},null); Expression callEnumerator = Expression.Call(original, getEnumerator); exprs.Add(Expression.Call(write,Expr

如鹿渴慕泉水的专栏 233

【JavaSE】反射、枚举、lambda表达式

反射,枚举,lambda表达式简单介绍

yj20040627的博客 9224
上一篇: 设函数f以概率P返回0,以概率1-P返回1,请构造函数以生成1/3的概率
下一篇: Activiti数据库版本与代码版本不匹配 Could not update Activiti database schema: unknown version from database: ‘5.2
maomeideliu
博客等级 码龄7年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值