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的类中序列化一样