我是否可以将C#扩展方法的可见性限制为同一程序集中的类?
假设我有这些文件: MyCode.cs我是否可以将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
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,同时编译的文件实际上是一个文件。(这在规范的前几节中,顺便说一句,它非常可读。)该死。好吧。我想这就是私有静态方法。谢谢