我是否可以将C#扩展方法的可见性限制为同一程序集中的类?

我是否可以将C#扩展方法的可见性限制为同一程序集中的类?,c#,.net,extension-methods,access-modifiers,class-visibility,C#,.net,Extension Methods,Access Modifiers,Class Visibility,假设我有这些文件: MyCode.cs namespace MyCodeNamespace { public class MyClass { //OMITTED } internal static class MyExtensions { internal static void Foo(this string str) { //OMITTED } } } OtherCode.cs using MyCodeNamespace

假设我有这些文件:

MyCode.cs

namespace MyCodeNamespace
{
  public class MyClass
  {
    //OMITTED
  }

  internal static class MyExtensions
  {
    internal static void Foo(this string str)
    {
      //OMITTED
    }
  }
}
OtherCode.cs

using MyCodeNamespace;
namespace OtherCodeNamespace
{
  //OMITTED
}
这两个文件是同一程序集的一部分。是否有任何方法可以使Foo访问MyCode.cs而不访问OtherCode.cs?我的问题与这个问题类似: 但它被接受的答案并不是我真正想要的。我想创建一个只对我正在处理的代码可见的扩展方法,根据上面问题的答案,有人仍然可以通过添加“using”语句来访问它。有没有一种方法可以创建一个只对我的代码可见的扩展方法,而对其他任何地方都不可见,甚至对同一程序集中的另一个类也不可见


我这样问是因为调用扩展方法的语法很方便,而且对我正在做的工作很有用(否则我只会创建一个私有方法),但我不希望其他人看到它,并从他们的代码中使用它,以防它不做他们认为它做的事情。由于Visual Studio的intellisense,我的扩展方法目前显示在可用方法列表中(以及添加它们所在的命名空间的选项)。

在.NET平台中没有命名空间受限访问修饰符

公共:访问不受限制。
受保护:访问仅限于包含类或从包含类派生的类型。
内部:访问权限仅限于当前程序集。
受保护的内部:访问仅限于当前程序集或从包含类派生的类型。
private:访问仅限于包含类型


这就是你要做的一切。因此答案是no

扩展方法只是编译为与直接调用静态帮助程序相同的IL的语义糖

MyExtensionMethods.DoSomething(myObject);
myObject.DoSomething();
您不能限制调用它,但可以从Intellisense中删除它的可见性

只需将扩展方法移动到另一个名称空间,在MyCode.cs中添加一个using语句,而不要在OtherCode.cs中包含该名称空间

using MyCodeNamespace;
namespace OtherCodeNamespace
{
  //OMITTED
}
[更新]

如果确实需要限制调用方,可以尝试使用反射来确定和限制,但这有点过分了。最好只使用一个私有的静态助手,而不是这样做

var frame = new System.Diagnostics.StackFrame(1, false);
var method = frame.GetMethod();
var type = method.DeclaringType;
// allow|deny type

我也有类似的问题。在ASP.NET核心中配置服务时,我不希望程序员看到我的内部扩展方法

我的解决方案是将所有扩展方法添加到
Startup.cs
中使用的名称空间
Microsoft.Extensions.DependencyInjection
,用户可以看到这些方法。(你总是这么做的。)

如果我想“隐藏”一些东西,我将扩展方法添加到
MyNamespace.Extensions
。如果用户写入正确的名称,则将显示用于添加使用的帮助器,但默认情况下不会列出该帮助器


我知道这不是一个解决方案,但可能会帮助某些人。

想想类似的事情

将尝试
InternalsVisibleTo

如果你的课程关闭了,可能不会有帮助,但你可以尝试一下

“但我不希望其他人看到它,并从他们的代码中使用它,以防它不做他们认为它做的事”——然后明确它做了什么?你为自己创造了大量的工作来防止其他人犯错误,你能让OtherCodeNameSpace成为父命名空间吗?C#中的名称空间是有组织的,它们在控制可访问性方面没有任何作用。@hometoast本质上我希望它像私有方法一样,但希望使用扩展方法语法。有可能吗?还有,为什么要投否决票?我在问之前寻找答案,但没有找到我想要的。我的问题不清楚吗?请让我知道,这样我以后可以问更好的问题。强调在问题更新后,不,根据C#spec,同时编译的文件实际上是一个文件。(这在规范的前几节中,顺便说一句,它非常可读。)该死。好吧。我想这就是私有静态方法。谢谢