可能的重复: 为什么c#不提供c++风格的' friend '关键字?
我希望类的私有成员变量可以被Tester类访问,而不将它们暴露给其他类。
在c++中,我只是将测试器类声明为朋友,我如何在c#中做到这一点?谁能给我举个例子吗?
可能的重复: 为什么c#不提供c++风格的' friend '关键字?
我希望类的私有成员变量可以被Tester类访问,而不将它们暴露给其他类。
在c++中,我只是将测试器类声明为朋友,我如何在c#中做到这一点?谁能给我举个例子吗?
没有直接等价的“朋友”-最接近的可用(并不是很接近)是InternalsVisibleTo。我只在测试中使用过这个属性——它非常方便!
示例:放置在AssemblyInfo.cs中
[assembly: InternalsVisibleTo("OtherAssembly")]
c#中没有“friend”关键字,但测试私有方法的一个选项是使用System。反射来获取方法的句柄。这将允许您调用私有方法。
给定一个具有以下定义的类:
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,那么你可以让VS自动生成一个带有私有访问器的代理类,方法是右键单击该方法并选择“Create Unit Tests…”
以一个非常常见的模式为例。类工厂制造小部件。Factory类需要处理内部构件,因为它是Factory类。两者都在同一个文件中实现,并且从设计、愿望和性质上讲,它们都是紧密耦合的类——事实上,Widget实际上只是来自工厂的输出类型。
在c++中,让Factory成为Widget类的朋友。
在c#中,我们能做什么?我想到的唯一合适的解决方案是发明一个接口IWidget,它只公开公共方法,并让Factory返回IWidget接口。
这涉及到相当多的乏味——在界面中再次暴露所有自然的公共属性。
最接近的等效方法是创建一个嵌套类,该类将能够访问外部类的private成员。就像这样:
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
}
}
如果被授予访问权限的类位于另一个包中,并且您所公开的方法被标记为内部或内部受保护,则可以模拟友元访问。您必须修改要共享的程序集,并将以下设置添加到AssemblyInfo.cs:
// Expose the internal members to the types in the My.Tester assembly
[assembly: InternalsVisibleTo("My.Tester, PublicKey=" +
"012700000480000094000000060200000024000052534131000400000100010091ab9" +
"ba23e07d4fb7404041ec4d81193cfa9d661e0e24bd2c03182e0e7fc75b265a092a3f8" +
"52c672895e55b95611684ea090e787497b0d11b902b1eccd9bc9ea3c9a56740ecda8e" +
"961c93c3960136eefcdf106955a4eb8fff2a97f66049cd0228854b24709c0c945b499" +
"413d29a2801a39d4c4c30bab653ebc8bf604f5840c88")]
公钥是可选的,取决于您的需要。