You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将System.Type转为自定义类?Discord机器人命令数据获取求助

问题2:访问Discord命令模块静态构造函数中的数据

其实你离成功很近了!静态构造函数的特性是:当类第一次被访问时会自动执行,所以只要你通过反射获取到模块类的Type对象,里面初始化的Alias、Summary这些静态字段/属性就已经有值了。给你一套完整的实现步骤:

  1. 筛选所有命令模块类型:
    先从当前程序集里找出所有继承自ModuleArchetype的非抽象类:

    var moduleTypes = Assembly.GetExecutingAssembly()
                              .GetTypes()
                              .Where(t => t.IsSubclassOf(typeof(ModuleArchetype)) && !t.IsAbstract);
    
  2. 确保静态构造函数执行(可选但稳妥):
    虽然访问类的成员会自动触发静态构造函数,但如果想显式确保它执行,可以用这个方法:

    foreach (var type in moduleTypes)
    {
        System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
    }
    
  3. 提取静态字段/属性的值:
    假设你用公共静态字段存储数据,就这么获取:

    var helpEntries = new List<CommandHelp>();
    foreach (var moduleType in moduleTypes)
    {
        // 获取Alias静态字段
        var aliasField = moduleType.GetField("Alias", BindingFlags.Public | BindingFlags.Static);
        string alias = aliasField?.GetValue(null) as string;
    
        // 获取Summary静态字段
        var summaryField = moduleType.GetField("Summary", BindingFlags.Public | BindingFlags.Static);
        string summary = summaryField?.GetValue(null) as string;
    
        // 添加到帮助列表
        if (!string.IsNullOrEmpty(alias))
        {
            helpEntries.Add(new CommandHelp { Alias = alias, Summary = summary });
        }
    }
    

如果你的模块用的是属性而非字段,把GetField()换成GetProperty()就行;要是字段是私有的,记得给BindingFlags加上BindingFlags.NonPublic。


内容的提问来源于stack exchange,提问作者Solarys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:28:32