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

时间:2018-10-02 11:14:24

标签: c# visibility

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

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

我希望既不从dll内部也不从外部看到方法。我只希望班级A看B.MethodVisibleToA,而只班B看A.MethodVisibleToA

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

我现在的选择不是很好:

  • 公开所有(meh),
  • 进行所有内部操作,并将A和B移动到另一个dll中(不可执行)

编辑:我忘了提到这些类在同一程序集中的同一名称空间中

解决方案:我采纳了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() { }
}

为变态问题提供更多变态解决方案:这将防止其他类甚至子类访问这两个接口和相对方法:

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() { }
    }
}

2 个答案:

答案 0 :(得分:2)

尝试使用接口,并按如下所示明确实现:

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中但在类类型中时将不可用

答案 1 :(得分:2)

您可以将方法标记为internal

  

内部类型或成员只能在同一程序集中的文件中访问

请参见以下示例:

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")]