我想声明一个模块的某些成员可以访问整个命名空间,但是没有它们可以访问它们。
这可能吗?
感谢。
答案 0 :(得分:9)
(为C#术语/示例道歉......)
没有。你可以限制:
internal
)[InternalsVisibleTo]
)protected
)(以及某些组合,例如protected internal
)
就是这样。没有任何基于调用者的名称空间。毕竟 - 我可以这样做:
namespace Your.Namespace {
public static class MyEvilClass {
public static void DoEvil() {
YourPrivateClass.PushTheRedButton();
}
}
}
我已经打破了......
答案 1 :(得分:5)
不,只有内部辅助功能限制了对当前程序集的访问。
由于你的帖子有VB.NET标签:internal是一个c#关键字,它在VB中的等价物是朋友:
孔列表为:
答案 2 :(得分:2)
虽然没有编译时支持,但你当然可以在运行时强制执行它。
new StackTrace().GetFrames()
这将为您提供堆栈跟踪,您可以检查该跟踪是否来自允许的命名空间。
请不要这样做。它肯定会让其他人的生活变得更糟。
答案 3 :(得分:0)
一旦将代码编译为IL,就没有命名空间的概念。编译器看到的只是类型名称中带点的字符串。如果要将呼叫者限制为已知方,请检查呼叫程序集的公钥并与白名单进行比较。