You need to enable JavaScript to run this app. C#跨解决方案复制方法报错:无法访问PropertySet的internal索引器
优惠活动
大模型
产品
解决方案
定价
更多

C#跨解决方案复制方法报错:无法访问PropertySet的internal索引器

问题成因确认

完全由PropertySet类上的internal索引器访问限制导致,和你排查的缺失依赖、框架引用问题没有关联。
C#中internal修饰的类成员,默认仅允许被同一程序集(编译生成的同一个dll/exe)内部的代码访问,跨程序集调用会直接被编译器拦截。
对应你的场景:

  • 解决方案A中能正常运行,是因为调用索引器的代码和PropertySet类的定义属于同一个编译输出程序集,同程序集内访问internal成员不受限制
  • 复制代码到解决方案B后,你的测试代码是编译在解决方案B自己的程序集里的,引用的是PropertySet所属的独立外部程序集dll,跨程序集访问internal索引器时,就会触发你看到的两个报错:编译器找不到公开可访问的索引器入口,同时识别出你在越界尝试访问internal的私有访问入口
可行的变通方案

根据你对PropertySet类的修改权限,可选择对应方案:

  • 调整索引器的访问级别:将原定义internal JToken this[string key] {get; set;}中的internal改为public,重新编译PropertySet所在的程序集,替换解决方案B中引用的dll即可。该方案改动最小,能快速打通跨程序集的访问权限。
  • 配置友元程序集放行:如果不希望将索引器设为公开(避免破坏原有类的封装边界),可以在PropertySet所在程序集的项目中,添加程序集级别的特性 [assembly: InternalsVisibleTo("解决方案B的项目程序集名称")],将解决方案B的程序集标记为可信友元,允许其访问原程序集的所有internal成员,重新编译原程序集并替换引用后即可解除访问限制。
  • 替换非法的索引器调用逻辑:如果无法修改PropertySet类的源码、也无法重新编译对应dll,就不要直接用ps["id"]这类跨程序集的internal访问方式,改为调用类上已有的公开属性获取方法(比如类中公开的GetProperty(string key)方法)拿到属性值,再执行后续的序列化、断言对比逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 03:45:04