我有3个集会:
如何确保C不使用该界面?
拆分程序集 - 不是一个选项。
答案 0 :(得分:6)
您可以使内部接口,并使用InternalsVisibleToAttribute
允许B
访问A
的内部成员(通过将属性添加到{{ 1}})。虽然它非常粗糙 - 你不能为个别成员做到这一点;它是全有或全无。
总的来说,这种特定的限制并不是.NET或C#中访问控制设计的一部分。
当然,您可以尝试将界面拆分为新的程序集,并通过A
将 提供给A和B - 但您也不希望这样做经常。该平台不是为此类设计的。 (它会起作用,但是使用你执行此操作的类型越多,就越难。)
答案 1 :(得分:1)
我将接口放在它自己的程序集(.csproj)中,只使项目B引用该程序集。
通过这种方式,您可以在遵循最佳实践的同时实现最佳封装。
答案 2 :(得分:0)
如果 A 在您的控件中,请让实现您的接口的类检查调用堆栈并阻止访问。这是一个繁重的运行时黑客。 我肯定不想使用它!
如果 C 未签名,您可以使用一些程序集重写魔法将 A 重写(复制)到 A'但不暴露接口。然后参考 A'。这个也有点沉重。
虽然我知道拆分程序集不是一个选项,但我是为了完整性:重构它们并且不要使用 C 的界面引用程序集。