【问题标题】:Making functions accessible from other classes in same project but not in another Project使函数可以从同一项目中的其他类访问,但不能在另一个项目中访问
【发布时间】:2022-01-20 09:53:15
【问题描述】:

我有一个名为Category_Helper_Project的项目。

在这个项目中有两个相关的类:Category_InterfaceCategory_File_Manager

这个项目的目的是它可以被其他项目引用。它在创建/访问类别时自动处理底层文件系统。

为此,Category_Interface 类访问Category_File_Manager 类。出于这个原因,Category_File_Manager 中的函数是公开的。

如果我从另一个项目中引用 Category_Helper_Project,是否可以使 Category_File_Manager 无法从其他项目中访问,同时保持从 Category_Interface? Accessing Category_File_Manager` 直接访问最有可能导致树结构出现问题。

最后我想知道如果让Category_File_Manager 不可访问也会使其在单元测试中不可访问,这将是非常不幸的。

我发现了一些类似的问题,例如Making a function only accessible from one other function,但他们并没有真正回答我的问题。

【问题讨论】:

标签: c# project access-modifiers project-reference


【解决方案1】:

要控制类的可访问性,您需要在声明之前添加一个关键字:

public class Category_File_Manager 

如果您不添加public,则默认为internal,这将导致类可以从声明它的项目/库访问,而不能从任何其他(包括测试)访问。

您可以使用InternalsVisibleTo 程序集级别属性来规避此问题,以获得测试库的好处。

[assembly: InternalsVisibleToAttribute("Category_Helper_Project_Tests")]

这有一点代码味道,您的库会在某种程度上意识到测试库,但这是一个吃蛋糕并吃掉它的情况。从生产代码中删除此类访问是一个好主意,因此如果没有在发布版本中添加,我会将其包装在编译中。

#if DEBUG
[assembly: InternalsVisibleToAttribute("Category_Helper_Project_Tests")]
#endif

【讨论】:

    【解决方案2】:

    当我一遍又一遍地阅读你的问题时,我认为你想向其他项目隐藏一个类,并使其可以从 Category_File_Manager 内部访问 这不能使用一个访问修饰符来完成,您应该简单地将 Category_Interface 设为内部以将其从外部隐藏并创建另一个只需要 API 的类从 Category_File_Manager 内部传递出去 更多你可以阅读here关于访问修饰符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2022-12-28
      • 2015-01-26
      相关资源
      最近更新 更多