用C#写一个特性,在函数上面可以自动计算函数耗时情况

ops/2024/9/24 6:25:43/

用C#写一个特性,在函数上面可以自动计算函数耗时情况

TimingAttribute类是自定义的特性类,用来标记需要计时的方法。TimingInterceptor类是一个拦截器,它通过反射来拦截被TimingAttribute标记的方法,并在方法执行前后进行计时。MyClass中的MyMethod方法被标记为需要计时,当调用这个方法时,它会被TimingInterceptor拦截,计算执行时间并输出。

using System;
using System.Diagnostics;
using System.Reflection;[AttributeUsage(AttributeTargets.Method)]
public class TimingAttribute : Attribute
{public void OnEntry(){Console.WriteLine("Method execution started.");}public void OnExit(double milliseconds){Console.WriteLine($"Method execution finished. Elapsed time: {milliseconds} milliseconds");}
}public class TimingInterceptor
{public void Intercept(MethodInfo targetMethod){var timingAttribute = (TimingAttribute)targetMethod.GetCustomAttribute(typeof(TimingAttribute));if (timingAttribute != null){timingAttribute.OnEntry();var stopwatch = Stopwatch.StartNew();targetMethod.Invoke(null, null);stopwatch.Stop();timingAttribute.OnExit(stopwatch.Elapsed.TotalMilliseconds);}else{targetMethod.Invoke(null, null);}}
}public class MyClass
{[Timing]public static void MyMethod(){// 模拟一个耗时的操作System.Threading.Thread.Sleep(2000);Console.WriteLine("MyMethod executed.");}
}class Program
{static void Main(string[] args){TimingInterceptor interceptor = new TimingInterceptor();MethodInfo method = typeof(MyClass).GetMethod("MyMethod");interceptor.Intercept(method);}
}

http://www.ppmy.cn/ops/31678.html

相关文章

基于Spring Boot的音乐网站与分享平台设计与实现

基于Spring Boot的音乐网站与分享平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 系统功能界面图,在系统首页可以查看首…

C语言指针是⼀种特殊的变量,只能⽤来保存地址。 这句话对吗?

一、问题 对于这个问题,答案是正确的,那为什么呢? 二、解答 本题考查的是对指针概念的理解。指针类型不同于整型和其他的数据类型,它是专门⽤来存放地址的数据类型。指针变量的定义形式为: 基类型 *变量名 例如&…

前端初学者的 CSS 入门

文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 CSS 的部分,瑶琴会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。 从这篇文章开始…

CentOS中常用的命令

CentOS7常用的命令集合 ls命令 ls [-a -l -h] [Linux路径] -a -l -h是可选的参数,[Linux路径]是可选的参数 当不使用选项和参数,直接用ls时,以平铺的形式,列出当前工作目录下的内容; -a表示 all ,即列出全…

017、Python+fastapi,第一个Python项目走向第17步:ubuntu24.04 无界面服务器版下安装nvidia显卡驱动

一、说明 新的ubuntu24.04正式版发布了,前段时间玩了下桌面版,感觉还行,先安装一个服务器无界面版本吧 安装时有一个openssh选择安装,要不然就不能ssh远程,我就是没选,后来重新安装ssh。 另外一个就是安…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现背投(58) 下一篇 :OpenCV在图像中寻找轮廓(60) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

基于语音识别的智能电子病历(一)

引子 A:“上周开年会了!” 俺:“有啥新的动向?” A:“今年计划开发基于语音识别的智能电子病历。老板说这个算是国内首创!” 俺:“嗯,俺做这个20多年了。” A:“语言…

UE4_Niagara_两个模型之间的粒子幻化

学习笔记,仅供参考! 操作步骤: 1、新建niagara system,添加空的发射器,渲染改为网格体渲染器,网格体为1M_Cube. 2、创建粒子材质重载。 3、渲染网格体的材质设置: 4、在发射器属性面板&#x…