我在命名空间中有两个类,这些类需要像这样相互调用:
public class A
{
void MethodVisibleToB() {}
}
public class B
{
void MethodVisibleToA() {}
}
我希望既不从dll内部也不从外部看到方法。我只希望班级A看B.MethodVisibleToA
,而只班B看A.MethodVisibleToA
。
我通常限制带有嵌套类的方法的可见性,但是这一次不可能而且不必要地复杂。您能建议一种防止从外部调用此方法的方法吗?
我现在的选择不是很好:
编辑:我忘了提到这些类在同一程序集中的同一名称空间中
解决方案:我采纳了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() { }
}
}
答案 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
}
}
如果需要从外部访问该方法,则可以在A
和B
所在的程序集中使用InternalsVisibleToAttribute
。无论如何,我建议您仅在非常有限的范围内使用,例如(单元测试)。将此行放置在程序集中的任何.cs
文件中(没有名称空间)
[assembly: System.InternalsVisibleTo("MyAssembly.Tests")]