能否通过代码获取MemberInfo及特性标注对应的代码位置?
答复
该需求技术层面完全可实现,不存在原理层面的阻碍。
核心依据如下:
- C# 编译生成的程序集配套的调试符号文件(便携PDB/Windows PDB)原生存储了所有类型成员、特性标注位置对应的源文件路径、行号、列号元数据,这部分数据是编译器生成时默认写入的,可通过编译配置控制是否生成。
- .NET 基础类库提供了原生的符号读取接口,可以直接通过
MemberInfo携带的元数据Token,查询到对应成员、成员上挂载的特性对应的源代码声明位置,不需要依赖异常堆栈、手动标记位置等变通方案。 - 针对你使用的 Unity Editor 场景:编辑器环境下默认会加载所有脚本程序集对应的完整调试符号,你在做UI绑定校验逻辑时,拿到目标字段对应的
FieldInfo对象后,直接调用符号读取接口就能拿到[Query]特性标注位置的源文件路径和行号,拼接到警告日志中输出即可,日志指向的位置和你调用日志打印方法的代码位置完全无关。 - 唯一的限制场景是正式发布构建时如果手动剥离了调试符号,就无法读取到位置信息,但这属于构建配置的选择问题,不属于技术不可实现的范畴。
你问题中给出的特性标注示例:
[Query("button-upvote")] private Button _buttonUpvote;
针对这段代码的位置获取,不需要修改特性定义、不需要额外给特性传位置参数,直接通过符号读取接口就能拿到精确的标注位置。
内容的提问来源于stack exchange,提问作者Tom Doodler
相关产品推荐
相关产品推荐

