【问题标题】:Accessing internal methods of nested namespace访问嵌套命名空间的内部方法
【发布时间】:2020-01-31 14:55:12
【问题描述】:

是否可以从函数TestFunc() 访问函数ConvertData()?

namespace MyNameSpace
{
  internal static class Convert
  {
    internal static int ConvertData()
    {
      //code
    }
  }
}
namespace MyNameSpace.Test
{
  public class TestDataType
  {
    public void TestFunc()
    {
      int x = Convert.ConvertData()
    }
  }
}

【问题讨论】:

  • 如果你得到了代码,为什么不试试呢?另外,您是指常规访问还是“通过使用反射忽略所有那些编译时规则”访问?
  • AFAIK internal 关键字指定类型/方法只能在定义它的同一程序集中访问。它存在的命名空间不会影响其可见性.见:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 鉴于您已将第二位称为TestFunc - 这是用于单元测试类型的东西吗?这是使用[InternalsVisibleTo] 的好理由之一

标签: c# .net


【解决方案1】:

Namespaces are irrelevant here,它们只是一种方便的排列类的方式,并允许两个类具有相同的名称(只要它们不在同一个命名空间中)。想象一下,您的硬盘驱动器不允许文件夹,所有文件都位于c:\ 的根目录!没有命名空间,同样是一团糟。 (但与硬盘的文件夹不同,命名空间没有访问限制)。

internal accessibility level 相对于assemblies。如果声明和使用代码在同一个程序集中 (example),您可以访问 internal 成员。

如果声明和使用在不同的程序集中(假设它在A 中声明并在A.Test 中使用,常见情况),是访问internal 声明的成员是可行的在A 来自A.Test。

通过将使用程序集 (A.Test) 提升为声明程序集 (A) 的 friend assembly 来实现此目的。

促销是在A 中添加此代码:[assembly: InternalsVisibleTo("A.Test")] 在A 代码中的任何位置,但AssemblyInfo.cs 是首选位置。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2018-02-03
    • 2011-10-11
    • 2021-12-23
    • 2020-07-10
    • 2020-05-20
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多