GeneXus扩展:遍历KB所有生成器属性的C#实现咨询
GeneXus Gx16/Gx17 扩展开发:对象层级逻辑与生成器属性遍历实现
Gx16/Gx17 知识库对象建模层级逻辑
Gx16、Gx17版本的知识库对象采用固定的层级嵌套结构,从顶层到底层的关系如下:
- 最顶层为
KB(知识库)对象,即你现有代码中UIServices.KB.CurrentKB对应的实例,是所有知识库操作的统一入口 - KB下挂载多个
Version(版本)对象,对应知识库的不同版本分支,每个版本独立管理自身的环境、模型资源 - 每个Version下包含若干
Environment(环境)对象,用于隔离开发、测试、生产等不同场景的配置 - 每个Environment关联一个对应的
Model(模型)对象,承载业务对象、配置数据的实际存储 - 每个Model下挂载多个
Generator(生成器)对象,对应不同目标平台(.NET、Java、移动端等)的代码生成规则配置,生成器的所有可配置属性都挂载在Generator实例的Properties集合下
生成器属性遍历C#实现代码
以下代码和你已实现的KB属性遍历逻辑完全等效,支持遍历知识库下所有生成器的全部属性,可直接复用现有表写入逻辑:
KB currentKb = UIServices.KB.CurrentKB; // 逐层遍历到所有生成器实例 foreach (Version kbVersion in currentKb.Versions) { foreach (Environment kbEnv in kbVersion.Environments) { Model envModel = kbEnv.Model; if (envModel == null) continue; foreach (Generator targetGen in envModel.Generators) { // 遍历单个生成器的所有属性,逻辑与KB属性遍历完全一致 foreach (Property genProperty in targetGen.Properties.Properties) { string propValue = string.Empty; if (genProperty.Value != null) { propValue = genProperty.Value.ToString(); } writer.AddTableData(new string[] { // 第一列可自定义标识,这里标注生成器、版本、环境信息方便区分 $"Generator: {targetGen.Name} | Version: {kbVersion.Name} | Env: {kbEnv.Name}", genProperty.Name, propValue, genProperty.IsDefault.ToString() }); } } } }
如果只需要获取单个指定生成器的属性,不需要全量遍历,可以直接通过生成器名称从模型的Generators集合索引获取目标实例,例如:
// 替换为你需要查询的生成器名称 Generator specificGen = envModel.Generators.GetByName("CSharp Web"); // 后续遍历specificGen.Properties.Properties的逻辑和上述代码完全一致
内容的提问来源于stack exchange,提问作者ealmeida
相关产品推荐
相关产品推荐

