某些方法的 C# 特定可见性

C# specific visibility for some methods

我在命名空间中有两个 classes,这些 classes 需要像这样互相调用:

public class A
{
    void MethodVisibleToB() {}
}
public class B
{
    void MethodVisibleToA() {}
}

我希望这些方法既不能从 dll 内部也不能从外部看到。我只希望 class A 看到 B.MethodVisibleToA 并且只希望 class B 看到 A.MethodVisibleToA.

我通常会限制带有嵌套 classes 的方法的可见性,但这次是不可能的,而且不必要地复杂。您能建议一种方法来防止从外部调用此方法吗?

我现在的选择不是很好:

编辑:我忘了提到 classes 在同一个程序集的同一个命名空间中

解决方案:我采纳了 Mrinal Kamboj 的建议并显式实现了接口:

internal interface IA
{
    void VisibleByB();
}

internal interface IB
{
    void VisibleByA();
}

public class A : IA
{
    void IA.VisibleByB() { }
}

public class B : IB
{
    void IB.VisibleByA() { }
}

Event more pervert solution to a pervert problem: 这将阻止其他classes甚至sub[=41访问这两个接口和相关方法=]es:

public static class ClassAreNotMeantToBeUsedThisWay
{
    interface IA
    {
        void VisibleByB();
    }

    interface IB
    {
        void VisibleByA();
    }

    public class A : IA
    {
        void IA.VisibleByB() { }
    }

    public class B : IB
    {
        void IB.VisibleByA() { }
    }
}

尝试使用接口并显式实现如下:

interface InterfaceA
{
    void MethodVisibleToB();
}

interface InterfaceB
{
    void MethodVisibleToA();
}

public class A : InterfaceA
{
    void InterfaceA.MethodVisibleToB() { }
}
public class B : InterfaceB
{
    void InterfaceB.MethodVisibleToA() { }
}

访问如下:

InterfaceA a = new A();
a.MethodVisibleToB();

InterfaceB b = new B();
b.MethodVisibleToA();

这种方法在包装在接口类型中时可用,在未包装在 Interface type 中时不可用,但在 class 类型中不可用

您可以将方法标记为internal

Internal types or members are accessible only within files in the same assembly

参见以下示例:

public class A
{
    internal void MethodVisibleToB() {}
}

public class B
{
    A aInstance = new A();

    internal void MethodVisibleToA() 
    {
        aInstance.MethodVisibleToB(); // this can only be called by methods that are within the same assembly as B
    }
}

附录

如果需要从外部访问该方法,可以在AB所在的程序集中使用InternalsVisibleToAttribute。无论如何,我建议只在非常有限的范围内使用它,例如(单元)测试。将此行放在程序集中的任何 .cs 文件中(没有命名空间)

[assembly: System.InternalsVisibleTo("MyAssembly.Tests")]