>假设我有这些文件:
我的代码.cs
namespace MyCodeNamespace
{
public class MyClass
{
//OMITTED
}
internal static class MyExtensions
{
internal static void Foo(this string str)
{
//OMITTED
}
}
}
其他代码.cs
using MyCodeNamespace;
namespace OtherCodeNamespace
{
//OMITTED
}
这两个文件是同一程序集的一部分。 有什么方法可以让 Foo 访问 MyCode.cs但不能访问 OtherCode.cs? 我的问题类似于这个问题:C# 扩展方法仅在一个类中可见和可访问("私有")但它公认的答案并不是我真正想要的。 我想制作一个仅对我正在处理的代码可见的扩展方法,并且根据上述问题的答案,有人仍然可以通过添加"using"语句来访问它。 有没有办法创建一个扩展方法,该方法仅对我的代码可见,而对其他任何地方都不可见,甚至对同一程序集中的另一个类也不可见?
我问是因为调用扩展方法的语法很方便,并且对我正在做的事情很有用(否则我只会创建一个私有方法),但我不希望其他人看到它并从他们的代码中使用它,以防它不做他们假设它做的事情。 多亏了Visual Studio的智能感知,我的扩展方法目前显示在可用方法列表中(以及添加它们所在的命名空间的选项)。
.NET 平台中没有命名空间限制的访问修饰符这样的东西。 从文档中
公共 :访问不受限制。
受保护:访问仅限于包含类或从包含类派生的类型。
内部:访问仅限于当前程序集。
受保护的内部:访问仅限于当前程序集或从包含类派生的类型。
私有:访问仅限于包含类型。
这就是你必须使用的全部内容。 所以答案是否定的。
扩展方法只是语义糖,编译为与直接调用静态帮助程序相同的 IL。
MyExtensionMethods.DoSomething(myObject);
myObject.DoSomething();
不能限制调用它,但可以从智能感知中删除其可见性。
只需将扩展方法移动到其他命名空间,在 MyCode 中添加 using 语句.cs并且不要在 OtherCode 中包含该命名空间.cs
[更新]
如果你真的需要限制调用者,你可以尝试使用反射来确定和限制,但这有点矫枉过正。最好简单地使用私有静态帮助程序,而不是这样做。
var frame = new System.Diagnostics.StackFrame(1, false);
var method = frame.GetMethod();
var type = method.DeclaringType;
// allow|deny type
我也有类似的问题。我不希望程序员在 Core 中配置服务时看到我的内部扩展方法 ASP.NET。
我的解决方案是将所有扩展方法添加到Startup.cs
中使用的命名空间Microsoft.Extensions.DependencyInjection
,用户可以看到这些方法。(就像你一直做的那样。
如果我想"隐藏"某些内容,我将扩展方法添加到MyNamespace.Extensions
。如果用户输入了正确的名称,则会显示用于添加的帮助程序,但默认情况下不会列出。
我知道这不是解决方案,但可能会帮助某人。
考虑类似的事情;
C# 程序集, 友元程序集会尝试InternalsVisibleTo
;如果您的课程关闭,也许没有帮助,但您可以尝试一下;