C#利用自定义特性以及反射,来提大型项目的开发的效率


在大型项目的开发过程中,需要多人协同工作,来加速项目完成进度。
比如一个软件有100个form,分给100个人来写,每个人完成自己的Form.cs的编写之后,要在Mainform调用自己写的Form。
如果按照正常的Form form1 = new Form()这种写法来构造窗口的话,相当于每个人都要改动Mainform.cs文件,这100个人只要有1个人在Mainform中改错代码了,那么该项目就在至关重要的Mainform.cs里埋下了1个bug,这是非常危险的一件事!
所以为了降低编码的耦合性,让每个人只要关心自己的类,不用关心mainform相关的代码,可以用特性加反射的方式来提高程序的健壮性。下面就是一个例子:
BaseForm.cs代码如下:
using System;
using System.Windows.Forms;namespace WinFormsApp1
{public enum CusFormType{HomePage, // 主页UserInfoPage, // 员工信息页LogPage, // 日志页SettingPage, // 系统设置页}public partial class BaseForm : Form{public BaseForm() { }public BaseForm(object par, Func<CusFormType, object, ActionType, BaseForm> func){param = par;Func = func;}public object param;public Func<CusFormType, object, ActionType, BaseForm> Func { get; set; }public class FormTypeAttribute : Attribute{public CusFormType[] tableType;public FormTypeAttribute(params CusFormType[] types) //构造函数{tableType = types;}}}
}
MainForm.cs代码如下:
//#define HAHA
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using static WinFormsApp1.BaseForm;namespace WinFormsApp1
{ public enum ActionType{New,Refresh}public partial class Mainform : Form{Func<CusFormType, object, ActionType, BaseForm> operFunc => FormOper;//Lambda 表达式是与匿名方法类似的内联表达式,但更加灵活;public Mainform(){InitializeComponent();GetTableTypeDic();}public static Dictionary<CusFormType, Type> tableTypeDic = new Dictionary<CusFormType, Type>();private void GetTableTypeDic(){var baseType = typeof(BaseForm);var allTypes = this.GetType().Assembly.GetTypes().Where(p => !p.IsInterface && baseType.IsAssignableFrom(p)).ToList();//通过反射获取所有继承自BaseForm的类的typeforeach (var item in allTypes){var attrs = item.GetCustomAttributes(typeof(FormTypeAttribute), false);//在派生类中重写时,返回应用于此成员并由System.type标识的自定义属性数组foreach (var attr in attrs){var curAttr = attr as FormTypeAttribute;if (curAttr.tableType != null){foreach (var type in curAttr.tableType)tableTypeDic[type] = item;}}}}private BaseForm FormOper(CusFormType tableType, object par, ActionType actionType = ActionType.New){if (tableTypeDic.ContainsKey(tableType)){if (actionType == ActionType.New){BaseForm tableForm = null;{tableForm = Activator.CreateInstance(tableTypeDic[tableType], new object[] { par, operFunc }) as BaseForm;tableForm.Text = tableType.ToString();}tableForm.Show();return tableForm;}}return null;}private void button1_Click(object sender, EventArgs e){operFunc.Invoke(CusFormType.HomePage, null,ActionType.New);}}
}
Form1代码如下:
using System;namespace WinFormsApp1
{[FormTypeAttribute(CusFormType.HomePage)]public partial class Form1 : BaseForm{public Form1(object par, Func<CusFormType, object, ActionType, BaseForm> func):base(par,func){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Func.Invoke(CusFormType.LogPage,null,ActionType.New);}}
}
form2代码如下:
using System;namespace WinFormsApp1
{[FormTypeAttribute(CusFormType.LogPage)]public partial class Form2 : BaseForm{public Form2(object par, Func<CusFormType, object, ActionType, BaseForm> func) : base(par, func){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Func.Invoke(CusFormType.SettingPage,null,ActionType.New);}}
}
form3代码就不用贴出来了,就是随便新建的一个form。
相关文章:
C#利用自定义特性以及反射,来提大型项目的开发的效率
在大型项目的开发过程中,需要多人协同工作,来加速项目完成进度。 比如一个软件有100个form,分给100个人来写,每个人完成自己的Form.cs的编写之后,要在Mainform调用自己写的Form。 如果按照正常的Form form1 new For…...
【传统视觉】C#创建、封装、调用类库
任务 因为实现代码相对简单,然后又没有使用Opencv,所以就直接用C#实现,C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…...
AutoMapper反向映射
#region 用来验证反向映射public class MemberSource{public string Name { get; set; }public MemberInnerSource MemberInnerSource { get; set; }public MemberOtherInnerSource MemberOtherInnerSource { get; set; }}public class MemberInnerSource{public string Name {…...
华为Mate30报名鸿蒙 HarmonyOS 4.0.0.108 系统更新
华为 Mate 30 系列于 2019 年 11 月 1 日上市,包括 Mate 30 4G / 5G、Mate 30 Pro 4G / 5G、保时捷设计版 Mate30 共五款机型。华为 Mate 30 系列 5G 版搭载麒麟 990 5G 处理器,同时支持 SA 及 NSA 5G 双模,适配三大运营商的 5G / 4G / 3G / …...
elementui Cascader 级联选择使用心得
相信大家对于elementui并不陌生,作为适配Vue的优秀UI框架之一,一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时,可通过级联选择器逐级查看并选择…...
【ChatGPT 指令大全】怎么利用ChatGPT写报告
目录 选定切入角度 报告开头 大纲生成 草稿撰写 研究报告 提出反对观点 报告总结 研究来源 总结 随着人工智能技术的快速发展,自然语言处理技术在各个领域的应用越来越广泛。其中,ChatGPT作为目前最先进的自然语言处理模型之一,其强…...
【枚举,构造】CF1582 C D
Problem - C - Codeforces 题意: 思路: 思路很简单,只删除一种,直接枚举删除的是哪一种即可 但是回文子序列的判定我vp的时候写的很答辩,也不知道为什么当时要从中间往两边扫,纯纯自找麻烦 然后就越改越…...
POJ 3169 Layout BellmanFord Dijkstra
一、心路历程 这一个题目写了三天,可以说是非常挣扎了,明明是例题,但是就是倔强着不去看书上的题解,WA了7次,TLE了4次。 写了不知道多少条测试用例,一遍一遍的过,一点一点的调试。 最后终于找到…...
数据库管理员知识图谱
初入职场的程序猿,需要为自己做好职业规划,在职场的赛道上,需要保持学习,并不断点亮自己的技能树。 成为一名DBA需要掌握什么技能呢,先让Chat-GPT为我们回答一下: 数据库管理系统 (DBMS)知识ÿ…...
中兴服务器支持百度“文心一言”,助力AI产业发展
前段时间,中兴和百度正式对外宣布中兴服务器将会支持百度“文心一言”,为其提供更加强劲的算力支撑,从而加速“文心一言”的完事升级与更新迭代,助力AI产业化应用和生态的繁荣发展。 “文心一言”是百度基于文心大模型技术推出…...
STM 如何通过网络 time.windows.com获取时间
STM 如何通过网络 time.windows.com获取时间 在STM32中,你可以使用STM32Cube HAL库提供的网络套接字API来通过网络获取时间。以下是一个示例代码,演示如何通过time.windows.com获取时间: #include "stm32xxxx.h" #include "lwip/sockets.h" #include …...
数据结构——红黑树
文章目录 一.红黑树的定义二.红黑树的插入1.红黑树节点的定义2.红黑树的插入操作3.总结: 三.红黑树与AVL树的比较四.检验手写的红黑树五.源码 一.红黑树的定义 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色ÿ…...
【C++】数据结构与算法:常用排序算法
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍常用排序算法。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路…...
【C++】Bullet3代码存档
之前试了一下Bullet3物理引擎,但在linux上编译失败,于是放弃了。令我不满的还有另外一个原因,下载的发行包竟然有500M。C的Bullet3代码根本用不了,大部分教程实际都是用的老版本。而且此项目还整了python版本,各种蹭人…...
弘扬“两弹一星”精神,勇攀科学技术高峰——道本科技商业大学党日活动圆满落幕
2023年8月2日,道本科技与商业大学携手举办了一场主题为“弘扬‘两弹一星’精神,勇攀科学技术高峰”的党日活动。本次活动旨在了解党领导下的中国核工业发展历程,传承和弘扬“两弹一星”精神,同时展示道本科技创新产品,…...
Java中创建对象的几种方式
背景 面试的时候有些面试官喜欢问这些, 这里简单记录一下. 常见方式 方式1: new XXXX(); 使用new关键字:这是最常见的创建对象的方式,使用new关键字后面跟上类名和参数列表(如果有),可以调用类的构造方法来创建对象…...
Python(三)
诚信像一面镜子,一旦打破,你的人格就会出现裂痕。 存在短路的情景 谢谢观看 Python(三)...
android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用
android 如何分析应用的内存(十五)——Visual Studio Code 调试Android 应用 在上一篇文章介绍了jdb调试java应用 接下来介绍用UI界面调试java应用,达到同jdb一样的效果。 同样的UI界面有很多选择,如Eclipse,Android …...
宁波银行最新内推码 MK4913
宁波银行最新内推码 MK4913 内推码: MK4913 内推二维码 : 网申路径: 网页端:登录宁波银行招聘官网: https://zhaopin.nbcb.com.cn 选择【校园招聘】-【招聘岗位】手机端:关注【宁波银行招聘】公众号&a…...
postgresql|数据库|MySQL数据库向postgresql数据库迁移的工具pgloader的部署和初步使用
前言: MySQL数据库和postgresql数据库之间的差异并不多,这里的差异指的是对SQL语言的支持两者并不大,但底层的东西差异是非常多的,例如,MySQL的innodb引擎概念,数据库用户管理,这些和postgresq…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...
【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...
多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...
