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

这篇具有很好参考价值的文章主要介绍了C#利用自定义特性以及反射,来提大型项目的开发的效率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 C#利用自定义特性以及反射,来提大型项目的开发的效率,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的类的type
            foreach (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。文章来源地址https://www.toymoban.com/news/detail-634354.html

到了这里,关于C#利用自定义特性以及反射,来提大型项目的开发的效率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搭建大型分布式服务(四十六)利用mockito不启动SpringBoot项目下进行单元测试

    SpringBoot支持集成Mockito做单元测试,有时候SpringBoot有很多外部依赖,在本地很难启动或者启动时间很长,而我们只想对某个方法进行测试,需要怎样做呢? 一、本文要点 接前文,我们已经已介绍在两种mock模式下,怎样根据入参返回自定义mock结果,但都是通过启动SpringBoot项

    2024年02月06日
    浏览(35)
  • C# 控件基础2——属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

    最近比较忙,一段时间没写博文了。最近仿vs做了一个自定义界面的功能,使用到了PropertyGrid控件,让我的代码量减少了很多,就抽个晚上把PropertyGrid控件的使用技巧分享一下。 PropertyGrid控件估计大家都很熟悉,但凡使用winform开发过界面的都认识,就是配置控件属性的控件,

    2024年02月09日
    浏览(32)
  • 利用C#调用Toast通知来进行自定义通知实现及自定义组件调用

    阳春三月的开始就连续加班了两天,就因为这个小小的Toast通知的实现,具体踩的坑就列在下方方便大家查阅了!!! 这次的需求是需要利用本地的PC工具写入注册表,在PC启动时调用工程进行文件检查,从而弹窗提示是否进行操作。操作不通即需要对不同的选择进行不同的批

    2024年02月08日
    浏览(32)
  • 利用Visual Studio新建一个C# Web项目

    首先就是要下载Visual Studio,具体可以登录官网查看下载教程。 首次打开Visual Studio,就会显示新建的页面,若是使用过的则根据以下操作进行:  以下界面则与新使用的新建界面一致:选择 ASP.NET Web ,点击下一步 填写项目名称,选择项目存放的位置,选择框架,点击创建  

    2023年04月08日
    浏览(76)
  • C#_特性&反射详解

    为程序元素额外添加声明信息的一种方式。 字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。 反射是一种能力,运行时获取程序集中的元数据。 字面理解:程序运行时,被加载到内存中,就会产生应用程序域( AppDomain ),里面就是 Assembly (程序集)

    2024年02月11日
    浏览(22)
  • C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6

    .NET6 正式版本已经发布有一阵子了,今天我就体验一下如何将.NET Framework的项目升级为.NET 6. 升级条件: Windows 操作系统 .NET 6 SDK Visual Studio 2022 17.0 或更高版本 ①首先是VS2022下载,直接上微软官方网站,下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/ 下载后,在线安装就

    2024年02月12日
    浏览(36)
  • C#系列-EF框架的创新应用+利用EF框架技术的知名开源应用项目(42)

    EF 框架的创新应用   EF 框架,即 Entity Framework ,是微软开发的一个开源的对象关系映射( ORM )框架,用于 .NET 应用程序中。它允许开发者以面向对象的方式处理数据库,而无需关心底层的 SQL 语句和数据库结构。 EF 框架的创新应用主要体现在以下几个方面: 代码优先迁移(

    2024年02月20日
    浏览(28)
  • 【C#进阶】C# 反射

    序号 系列文章 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 ✋ 大家好,我是writer桑,本章为大家介绍 C# 中的 反射 。 反射 指的是程序可以 访问,检测和修改 它本身状态或行为的一种行为。 其中访问的目标包括程序集 1 、模块和类型对象等。可

    2024年03月15日
    浏览(40)
  • 【Java反射】Java利用反射获取和设置对象某属性的值

    通用工具类: 测试:

    2024年02月02日
    浏览(40)
  • 【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。

       📝个人主页:哈__ 期待您的关注  我想要通过反射来打印如下效果的类信息。 Student类如下代码所示。  你是否有思路?如果你不了解反射的话,我来给大家简单的介绍一下反射的使用方法。 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操

    2024年04月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包