.NET - 是否可以声明只能访问命名空间的模块成员?

时间:2009-11-02 22:48:52

标签: .net vb.net namespaces

我想声明一个模块的某些成员可以访问整个命名空间,但是没有它们可以访问它们。

这可能吗?

感谢。

4 个答案:

答案 0 :(得分:9)

(为C#术语/示例道歉......)

没有。你可以限制:

  • 到当前程序集(internal
  • 命名其他程序集([InternalsVisibleTo]
  • 到子类(protected

(以及某些组合,例如protected internal

就是这样。没有任何基于调用者的名称空间。毕竟 - 我可以这样做:

namespace Your.Namespace {
    public static class MyEvilClass {
       public static void DoEvil() {
           YourPrivateClass.PushTheRedButton();
       }
    }
}

我已经打破了......

答案 1 :(得分:5)

不,只有内部辅助功能限制了对当前程序集的访问。

Access Levels in C#

由于你的帖子有VB.NET标签:internal是一个c#关键字,它在VB中的等价物是朋友:

Friend Keyword in VB.NET

孔列表为:

Access Levels in VB.NET

答案 2 :(得分:2)

虽然没有编译时支持,但你当然可以在运行时强制执行它。

 new StackTrace().GetFrames()

这将为您提供堆栈跟踪,您可以检查该跟踪是否来自允许的命名空间。

请不要这样做。它肯定会让其他人的生活变得更糟。

答案 3 :(得分:0)

一旦将代码编译为IL,就没有命名空间的概念。编译器看到的只是类型名称中带点的字符串。如果要将呼叫者限制为已知方,请检查呼叫程序集的公钥并与白名单进行比较。