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

C# C某些方法的特定可见性,c#,visibility,C#,Visibility,我在一个命名空间中有两个类,这些类需要像这样相互调用: public class A { void MethodVisibleToB() {} } public class B { void MethodVisibleToA() {} } 我不希望从dll内部或外部看到这些方法。我只想让A班看到B.MethodVisibleToA,只想让B班看到A.MethodVisibleToA 我通常用嵌套类限制方法的可见性,但这一次既不可能,也不必要地复杂。您能建议一种防止从外部调用此方

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

public class A
{
    void MethodVisibleToB() {}
}
public class B
{
    void MethodVisibleToA() {}
}
我不希望从dll内部或外部看到这些方法。我只想让A班看到B.MethodVisibleToA,只想让B班看到A.MethodVisibleToA

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

我现在的选择不是很好:

把一切公之于众, 使所有内部和移动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() { }
}
pervert问题的Event more pervert解决方案:这将阻止从其他类甚至子类访问这两个接口和相关方法:

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() { }
}
访问权限如下:

interface InterfaceA
{
    void MethodVisibleToB();
}

interface InterfaceB
{
    void MethodVisibleToA();
}

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

这种方法在包装为接口类型时可用,在未包装为接口类型时不可用,但在类类型中可以将方法标记为

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

请参见以下示例:

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
    }
}
补遗 如果需要从外部访问该方法,可以在A和B所在的部件中使用。无论如何,我建议这只适用于非常有限的范围,例如单元测试。将此行放在程序集中没有命名空间的任何.cs文件中

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

为A和B使用一个接口,显式地实现方法并访问它。问题不是那么清楚,我不希望从dll内部或外部看到这些方法。我只想让类A看到B.MethodVisibleToA,而只想让类B看到A.MethodVisibleToA问题不是那么清楚,我不想让方法从dll内部或外部被看到。我只想让类A看到B.MethodVisibleToA,也只想让类B看到A.MethodVisibleToWelcome,尽管根据标准用例,这些接口方法的设计应该仅用于创建严格的访问限制,当您希望最终用户知道我们试图实现什么时。就像在一些实现ISerializable的类中序列化一样