某些方法的 C# 特定可见性
C# specific visibility for some methods
我在命名空间中有两个 classes,这些 classes 需要像这样互相调用:
public class A
{
void MethodVisibleToB() {}
}
public class B
{
void MethodVisibleToA() {}
}
我希望这些方法既不能从 dll 内部也不能从外部看到。我只希望 class A 看到 B.MethodVisibleToA
并且只希望 class B 看到 A.MethodVisibleToA
.
我通常会限制带有嵌套 classes 的方法的可见性,但这次是不可能的,而且不必要地复杂。您能建议一种方法来防止从外部调用此方法吗?
我现在的选择不是很好:
- 全部 public (meh),
- 将所有内容设为内部并将 A 和 B 移动到另一个 dll 中(不可行)
编辑:我忘了提到 classes 在同一个程序集的同一个命名空间中
解决方案:我采纳了 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() { }
}
Event more pervert solution to a pervert problem: 这将阻止其他classes甚至sub[=41访问这两个接口和相关方法=]es:
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
中时不可用,但在 class 类型中不可用
您可以将方法标记为internal
Internal types or members are accessible only within files in the same assembly
参见以下示例:
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")]
我在命名空间中有两个 classes,这些 classes 需要像这样互相调用:
public class A
{
void MethodVisibleToB() {}
}
public class B
{
void MethodVisibleToA() {}
}
我希望这些方法既不能从 dll 内部也不能从外部看到。我只希望 class A 看到 B.MethodVisibleToA
并且只希望 class B 看到 A.MethodVisibleToA
.
我通常会限制带有嵌套 classes 的方法的可见性,但这次是不可能的,而且不必要地复杂。您能建议一种方法来防止从外部调用此方法吗?
我现在的选择不是很好:
- 全部 public (meh),
- 将所有内容设为内部并将 A 和 B 移动到另一个 dll 中(不可行)
编辑:我忘了提到 classes 在同一个程序集的同一个命名空间中
解决方案:我采纳了 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() { }
}
Event more pervert solution to a pervert problem: 这将阻止其他classes甚至sub[=41访问这两个接口和相关方法=]es:
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
中时不可用,但在 class 类型中不可用
您可以将方法标记为internal
Internal types or members are accessible only within files in the same assembly
参见以下示例:
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")]