如何将System.Type转为自定义类?Discord机器人命令数据获取求助
问题2:访问Discord命令模块静态构造函数中的数据
其实你离成功很近了!静态构造函数的特性是:当类第一次被访问时会自动执行,所以只要你通过反射获取到模块类的Type对象,里面初始化的Alias、Summary这些静态字段/属性就已经有值了。给你一套完整的实现步骤:
筛选所有命令模块类型:
先从当前程序集里找出所有继承自ModuleArchetype的非抽象类:var moduleTypes = Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.IsSubclassOf(typeof(ModuleArchetype)) && !t.IsAbstract);确保静态构造函数执行(可选但稳妥):
虽然访问类的成员会自动触发静态构造函数,但如果想显式确保它执行,可以用这个方法:foreach (var type in moduleTypes) { System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle); }提取静态字段/属性的值:
假设你用公共静态字段存储数据,就这么获取: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
相关产品推荐
相关产品推荐

