4

假设我有这些文件:

我的代码.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
}

这两个文件是同一个程序集的一部分。有什么方法可以让 MyCode.cs 可以访问 Foo 而 OtherCode.cs 不能访问?我的问题类似于这个问题: C# Extension Methods only visible and access within one class ("private") 但它接受的答案并不是我真正想要的。我想制作一个仅对我正在处理的代码可见的扩展方法,根据上述问题的答案,有人仍然可以通过添加“使用”语句来访问它。有没有一种方法可以创建一个仅对我的代码可见的扩展方法,而在其他任何地方,甚至同一程序集中的另一个类都不可见?

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

4

4 回答 4

5

.NET 平台中没有名称空间限制访问修饰符之类的东西。 从文档

public :访问不受限制。
protected :访问仅限于包含类或从包含类派生的类型。
内部:访问仅限于当前程序集。
protected internal:访问仅限于当前程序集或从包含类派生的类型。
private :访问仅限于包含类型。

这就是你所要做的。所以答案是否定的。

于 2015-01-23T20:50:10.930 回答
2

扩展方法只是编译成与直接调用静态助手相同的 IL 的语义糖。

MyExtensionMethods.DoSomething(myObject);
myObject.DoSomething();

您不能限制它被调用,但您可以从 Intellisense 中删除它的可见性。

只需将扩展方法移动到不同的命名空间,在 MyCode.cs 中添加 using 语句,并且不要在 OtherCode.cs 中包含该命名空间

[更新]

如果你真的需要限制调用者,你可以尝试使用反射来确定和限制,但这有点矫枉过正。最好简单地使用私有静态助手而不是这样做。

var frame = new System.Diagnostics.StackFrame(1, false);
var method = frame.GetMethod();
var type = method.DeclaringType;
// allow|deny type
于 2016-10-13T19:36:58.077 回答
0

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

我的解决方案是将所有扩展方法添加到Microsoft.Extensions.DependencyInjection使用的命名空间中,Startup.cs并且用户可以看到这些方法。(就像你经常做的那样。)

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

我知道这不是解决方案,但可能会对某人有所帮助。

于 2018-10-05T11:51:38.767 回答
0

想想类似的事情;

c#组装,朋友组装 试试InternalsVisibleTo;如果您的课程已关闭,可能无济于事,但您可以尝试一下;

于 2020-06-01T14:21:54.263 回答