InternalsVisibleTo 带有“私人保护”

Posted

技术标签:

【中文标题】InternalsVisibleTo 带有“私人保护”【英文标题】:InternalsVisibleTo with "private protected" 【发布时间】:2018-05-15 10:18:43 【问题描述】:

.Net 框架和 C# 的新版本提供了新的访问修饰符:private protected。为了访问这样的成员,该类必须同时

驻留在同一个程序集中并且 派生自定义类。

(与protected internal 相比,满足其中一个条件就足够了)

出于测试目的,InternalsVisibleTo 属性在我想从位于不同程序集中的测试类中访问类的非公共成员时非常方便。

private protected 如何与InternalsVisibleTo 属性交互?我可以从派生自原始类的“朋友”程序集中的类中访问此类成员吗?

(我无法在我的机器上尝试,因为 Visual Studio 和 C# 的版本太旧了)。

【问题讨论】:

好问题。我也无法对其进行测试,但我认为它也适用于private protected,尽管他们到处(例如here 或here)都提到它仅适用于internal 成员。 是的,正如你所描述的那样。 【参考方案1】:

是的,从基类派生的友好测试程序集中的类将可以访问private protected 成员。

新访问修饰符的proposal 明确说明了它映射到的CLR 访问说明符(protectedAndInternal),但没有说明它与InternalVisibleTo 的关系。

【讨论】:

请引用。 @RobertHarvey C# 7.2 有正式规范吗? @Rune 甚至 C# 6 仍然是草稿。 C# 开发已经完全开放,这意味着在 csharplang 存储库中的 Github 提案中描述了特性、辩论、原型化和实现。该提案的链接是最好的引用,仅次于 Roslyn 代码本身【参考方案2】:

截至目前,InternalVisibleTo 的文档在备注部分提到了 internalprivate protected

(https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.internalsvisibletoattribute?view=netcore-2.2#remarks)

【讨论】:

以上是关于InternalsVisibleTo 带有“私人保护”的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 [assembly: InternalsVisibleTo()]?

如何指定多个项目的 InternalsVisibleTo

Visual Studio 2017 和新的 .csproj InternalsVisibleTo

如何对 Moq 可见内部接口?

Moq 内部类和/或内部方法

C#进阶系列06 类型和成员基础