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

时间:2009-09-13 02:41:15

标签: c# .net extension-methods

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

示例:

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

在上面的示例中,我希望扩展方法“MakeMillionaire”扩展String类 only ,使其在A类中可见并可访问。我可以通过在静态类中定义扩展方法来实现此目的A级?

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

2 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:11)

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