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

示例:

class A
{
     String foo = "";
     String bar = foo.MakeMillionaire("arg");
}

在上面的示例中,我想要扩展方法“MakeMillionaire”。扩展String类 only 在A类中是可见的和可访问的。我可以通过在A类的静态类中定义扩展方法来以某种方式做到这一点吗?

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

有帮助吗?

解决方案

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

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

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

其他提示

在单独的命名空间中声明扩展方法,并且可以将该命名空间包含在要使用它们的特定文件中。然后,在单独的文件中声明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!!";
        }
    }
}

<强> ClassA.cs:

using Extension;

public class ClassA{
    //Work your magic here, using the EnumValue Extension method
    //wherever you want
}

<强> ClassB.cs

public class ClassB{
    //EnumValue is not a valid Extension Method here.
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top