首页 > 其他分享 >动态事件id反查事件类型

动态事件id反查事件类型

时间:2024-10-18 16:25:34浏览次数:6  
标签:反查 type AttributeTargets public 事件 Type id

简介

项目中的事件派发系统,会动态生成唯一id并赋值给对应字段,当发生报错时,日志仅打印事件id,并不知道具体事件类型,故作此拓展。

方案思路

  • 构建一个新的特性,将使用有事件id的类全部使用此特性注册一次
  • 获取到所有程序集,并将注册过此特性的类全部持有到
  • 在初始化时,将所有事件id记录一次
  • 后续查找时,直接使用事件id进行匹配,并将事件类型进行打印

使用技术

  • 反射
  • 特性

代码示例

/// <summary>
/// 事件Debug特性类(用于寻找那些注册有事件的类)
/// </summary>
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Field|AttributeTargets.Constructor|AttributeTargets.Property)]
public class EventDebugInfo : Attribute
{
    private Type type;
    public EventDebugInfo(Type type)
    {
        this.type = type;
    }
    public Type Type
    {
        get { return type; }
    }
}
/// <summary>
/// 记录事件id信息的字典
/// </summary>
private static Dictionary<int,string> eventIdDict = new Dictionary<int,string>();

/// <summary>
/// 打印事件信息
/// </summary>
/// <param name="eventId">全局唯一事件id</param>
public static void LogEventInfo(int eventId)
{
    //仅在第一次打印时初始化字典
    if (eventIdDict.Count <= 0)
    {
        Assembly currentAssembly = Assembly.GetExecutingAssembly();
        foreach (Type type in currentAssembly.GetTypes())
        {
            if (type.IsDefined(typeof(EventDebugInfo)))
            {
                FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static);
                foreach (FieldInfo fieldInfo in fieldInfos)
                {
                    object fieldValue = fieldInfo.GetValue(null);
                    if (int.TryParse(fieldValue.ToString(), out int value))
                    {
                        string eventStr = $"EventDebugManager: Id{eventId}         {type.Name}.{fieldInfo.Name}";
                        if (!eventIdDict.TryAdd(value, eventStr))
                        {
                            eventIdDict.Remove(value);
                        }
                    }
                }
            }
        }
    }
    //字典中获取debug信息,并打印
    if (eventIdDict.TryGetValue(eventId, out string eventName))
    {
        Debug.LogError(eventName);
    }
}

标签:反查,type,AttributeTargets,public,事件,Type,id
From: https://www.cnblogs.com/comradexiao/p/18466994

相关文章

  • 遇到:insmod:error inserting Invalid module format,的原因
    1.在使用insmod安装驱动的时候遇见,一个insmod:errorinsertingInvalidmoduleformat报错信息,通过多方考察,出现这个报错的原因是,编译驱动的系统内核版本与你目前需要安装这版驱动的系统内核是不一样导致的。2.首先可以使用uname-a或者uname-r命令来确认自己所用系统的内核......
  • windows日志怎么查看(含windows事件ID状态码)
    要查看Windows异常重启日志,可以按照以下步骤进行操作:打开“事件查看器”:在Windows操作系统中,按下Win+R键,在运行对话框中输入“eventvwr.msc”,然后点击“确定”按钮。在“事件查看器”窗口中,展开“Windows日志”文件夹,然后选择“系统”。在右边的窗格中,你会看到所有系统......
  • Maid: 跨平台AI助手应用的开源革命
    Maid:跨平台AI助手应用的开源革命在人工智能快速发展的今天,如何让普通用户也能方便地使用AI技术成为了一个重要话题。Maid项目正是为解决这一问题而生的一款创新应用。作为一个开源的跨平台Flutter应用,Maid为用户提供了便捷的界面来与各种AI模型进行交互,无论是在移动设备还是......
  • 基于粒子群算法的PID控制器优化设计
    PID控制器作为一种重要的控制方式,在很多工程领域都得到了广泛的应用,而如何优化PID控制器的参数,使其满足特定的工程需求,是一个值得研究和探讨的问题,粒子群算法(ParticleSwarm Optimization,PSO)作为一种优化算法,已经被广泛应用于PID控制器的参数优化中,并且取得了良好的效果,本文介......
  • Nuxt.js 应用中的 app:templates 事件钩子详解
    title:Nuxt.js应用中的app:templates事件钩子详解date:2024/10/18updated:2024/10/18author:cmdragonexcerpt:app:templates是Nuxt.js中一个强大的生命周期钩子,它在NuxtApp生成过程中调用。这一钩子允许开发者自定义、修改或添加新文件到构建目录,提供了极大的......
  • python: invalid value encountered in divide以及invalid value encountered in doub
    运行命令pythoneqtl_prepare_expression.pydata.tpm.gctdata.reads_count.gct--tpm_threshold0.1--count_threshold2--sample_frac_threshold0.2--normalization_methodtmm--outputdata.txt时出现了报错“invalidvalueencounteredindivide”以及“invalidvalue......
  • idea修改maven配置
    <?xmlversion="1.0"encoding="UTF-8"?><!--LicensedtotheApacheSoftwareFoundation(ASF)underoneormorecontributorlicenseagreements.SeetheNOTICEfiledistributedwiththisworkforadditionalinformationregardi......
  • 根据json转idea 自带Http Client脚本
    importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;publicclassApiDocConverter{publicstaticvoidmain(String[]args)throwsException{Stringjson="{\n"+&quo......
  • DevExpress WinForms中文教程:Data Grid - 如何为网格绑定ADO. NET数据
    在本教程中,您将学习如何做到以下几点:在一个WinForms项目中创建并配置ADO.NET数据源将DevExpressWinForms数据网格绑定到数据源。将更改发布到数据库。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能......
  • 第六届国际科技创新学术交流大会暨管理科学信息化与经济创新发展学术会议(MSIEID 2024)
    随着全球化和信息化的不断深入,管理科学、信息化和经济发展之间的关系变得更加紧密和复杂。信息技术在管理科学领域的应用不仅提高了企业和组织的运行效率,还为创新、市场分析以及决策制定提供了全新的工具和方法。而经济创新则成为驱动国家和地区经济持续发展、提高竞争力的重要......