我在命名空间中有两个类,这些类需要像这样相互调用:
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
}
}
补遗
如果需要从外部访问该方法,则可以在程序集中使用A
和B
所在的InternalsVisibleToAttribute
。无论如何,我只建议将其用于非常有限的范围,例如(单元(测试。将此行放在程序集中的任何.cs
文件中(不带命名空间(
[assembly: System.InternalsVisibleTo("MyAssembly.Tests")]