什么是C#相当于朋友?

可能重复:
为什么C#不提供C ++风格的“朋友”关键字?

我希望一个类的私有成员variables可以被Tester类访问,而不会暴露给其他类。

在C ++中,我只是将Tester类声明为朋友,我如何在C#中执行此操作? 有人能给我一个例子吗?

没有直接相当于“朋友” – 最接近可用(而且不是非常接近)的是InternalsVisibleTo 。 我只用过这个属性来进行testing – 非常方便!

例如:放在AssemblyInfo.cs

 [assembly: InternalsVisibleTo("OtherAssembly")] 

等价的是创build一个嵌套的类,它将能够访问外部类的私有成员。 像这样的东西:

 class Outer { class Inner { // This class can access Outer's private members } } 

或者如果您更喜欢将Inner类放在另一个文件中:

 Outer.cs partial class Outer { } Inner.cs partial class Outer { class Inner { // This class can access Outer's private members } } 

采取一个非常普遍的模式。 类工厂使小部件。 工厂类需要与内部有关,因为它是工厂。 两者都是在相同的文件中实现的,并且是按照devise和愿望以及本质来说,紧密耦合的类 – 事实上,Widget实际上只是工厂的输出types。

在C ++中,使Factory成为Widget类的一个朋友。

在C#中,我们可以做什么? 我遇到的唯一体面的解决scheme是创造一个接口,IWidget,它只公开公有方法,并让Factory返回IWidget接口。

这涉及到相当多的乏味 – 在界面中再次暴露所有自然的公共财产。

C#中没有“friend”关键字,但是testing私有方法的一个select是使用System.Reflection来获取方法的句柄。 这将允许您调用私有方法。

给定一个有这个定义的类:

 public class Class1 { private int CallMe() { return 1; } } 

您可以使用以下代码调用它:

 Class1 c = new Class1(); Type class1Type = c.GetType(); MethodInfo callMeMethod = class1Type.GetMethod("CallMe", BindingFlags.Instance | BindingFlags.NonPublic); int result = (int)callMeMethod.Invoke(c, null); Console.WriteLine(result); 

如果您使用的是Visual Studio Team System,则可以通过右键单击该方法并select“创buildunit testing…”来让VS自动生成带有私有访问器的代理类。

如果被授予访问权限的类位于另一个包内,并且您公开的方法被标记为内部或内部保护,则可以模拟朋友访问。 您必须修改要共享的程序集并将以下设置添加到AssemblyInfo.cs中:

 // Expose the internal members to the types in the My.Tester assembly [assembly: InternalsVisibleTo("My.Tester, PublicKey=" + "012700000480000094000000060200000024000052534131000400000100010091ab9" + "ba23e07d4fb7404041ec4d81193cfa9d661e0e24bd2c03182e0e7fc75b265a092a3f8" + "52c672895e55b95611684ea090e787497b0d11b902b1eccd9bc9ea3c9a56740ecda8e" + "961c93c3960136eefcdf106955a4eb8fff2a97f66049cd0228854b24709c0c945b499" + "413d29a2801a39d4c4c30bab653ebc8bf604f5840c88")] 

公钥是可选的,取决于你的需要。