C#扩展方法仅在一个类中可见且可访问("私有")

Ale*_*lex 11 .net c# extension-methods

在C#中,是否可以在类上创建扩展方法但限制类中的可见性/可访问性?(例如,M类的扩展方法A只能在Z类中访问)

例:

class A
{
     String foo = "";
     String bar = foo.MakeMillionaire("arg");
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中我想要的扩展方法"MakeMillionaire"扩展String类是A类.我可以通过A类中定义的静态类扩展方法做到这一点不知何故内可见和可访问?

编辑:尝试常规嵌套类会产生"错误:必须在顶级静态类中定义扩展方法".

SLa*_*aks 15

扩展方法只能在静态非泛型外(非嵌套)类中定义.

我在这种情况下通常做的是在同一文件中的不同命名空间中创建一个单独的静态内部类,然后仅在该文件中包含该命名空间.

它仍然可以在该集合中的其他类中看到; 避免这种情况的唯一方法是将消费类(class A在您的示例中)移动到它自己的程序集,您可能不想这样做.


Mar*_*ter 12

在单独的命名空间中声明扩展方法,并且可以将该命名空间包含在要使用它们的特定文件中.然后,在单独的文件中声明ClassA(您要使用扩展方法的类),并在ClassA.cs的顶部使用该命名空间.这样,只有该类才能访问这些扩展方法.

编辑:

像下面这样的东西

namespace Extension {
    public static class ExtensionMethods {
        public static string EnumValue(this MyEnum e) {
            switch (e) {
                case MyEnum.First:
                    return "First Friendly Value";
                case MyEnum.Second:
                    return "Second Friendly Value";
                case MyEnum.Third:
                    return "Third Friendly Value";
            }
            return "Horrible Failure!!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ClassA.cs:

using Extension;

public class ClassA{
    //Work your magic here, using the EnumValue Extension method
    //wherever you want
}
Run Code Online (Sandbox Code Playgroud)

ClassB.cs

public class ClassB{
    //EnumValue is not a valid Extension Method here.
}
Run Code Online (Sandbox Code Playgroud)