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



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

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

我希望这些方法既不能从 dll 内部看到,也不能从外部看到。我只想让A班看到B.MethodVisibleToA,只有B班看到A.MethodVisibleToA

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

我现在的选择不是那么好:

  • 公开所有(meh(,
  • 将所有内容全部设置为内部并在另一个 dll 中移动 A 和 B(不可行(

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

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

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

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中时将不可用,而是类类型

您可以将方法标记为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")]

最新更新