如何对自定义IL检查器隐藏C#类库中的数据类?
KTA类检查器生成顶层类列表时,默认通过反射枚举程序集内的公开类型,你遇到的冗余条目问题,核心是仅作为参数使用的纯数据类被标记为公开类型,被反射逻辑抓取到了。以下是纯.NET/C#层面可落地的解决方案,不需要修改KTA内置配置:
方案1:将数据类修改为internal访问级别,搭配
InternalsVisibleTo特性(优先推荐)
KTA生成顶层类列表时调用的是程序集的GetExportedTypes()方法,该方法只会返回public级别的类型,不会抓取internal类型。你可以把所有仅作为方法参数使用、不需要被KTA直接作为独立类实例化的纯数据类,访问修饰符从public改为internal,这些类就不会出现在顶层冗余列表中。
如果数据类定义项目和对外暴露KTA调用方法的项目不是同一个,只需要在数据类所在项目的AssemblyInfo.cs中添加如下特性,允许方法所在程序集访问这些internal类即可,不会破坏原有编译:using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("你对外暴露给KTA的类库的完整程序集名称")]该方案完全不会影响方法参数的层级展示:KTA解析具体方法的参数结构时,会通过方法签名直接获取参数类型,递归读取类型下的所有公共属性渲染结构,不受参数类型本身访问级别的影响,和你之前使用public类的展示效果完全一致。
方案2:使用
EditorBrowsable特性标记过滤
如果受项目架构限制无法调整类的访问修饰符,可以给所有纯数据类添加EditorBrowsable(EditorBrowsableState.Never)特性。该特性是.NET原生提供的API隐藏标记,用于告知IDE、自动化工具不要在公开API列表中展示对应类型,多数版本的KTA类检查器会识别该标记,跳过对应类的展示:using System.ComponentModel; [EditorBrowsable(EditorBrowsableState.Never)] public class MsGraphRequestParam { // 类内公共属性保持原有定义不变,不影响参数结构展示 }注意:部分新版本KTA的类检查器未实现对该特性的识别,兼容性弱于方案1,建议优先测试后再使用。
方案3:将数据类嵌套为业务类的私有类型
如果某一个数据类仅被单个对外暴露的业务类使用,可以直接把该数据类定义为对应业务类的私有嵌套类,这类嵌套私有类型同样不会被GetExportedTypes()枚举到,不会出现在顶层类列表中。该方案的缺点是不适合多个业务类共用参数类的场景,会产生代码冗余。
以上三种方案均不会改动你已经调试完成的MS Graph API调用逻辑。如果尝试方案1后仍然能看到冗余类,说明你使用的KTA版本类检查器没有使用
GetExportedTypes()枚举类型,而是枚举了程序集下所有类型,这种场景就属于KTA产品本身的机制问题,需要联系Kofax官方确认是否提供了自定义类型隐藏的配置入口。

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

