我有一个班,负责复杂的科学计算.它被设置为仅允许用户创建正确实例化的案例.但是,要正确测试代码,需要直接设置内部状态变量,因为参考文档在其测试用例中提供了这些数据.但是,如果做得不正确,它可能会使州无效.
所以我必须有能力,一个成员函数,从单元测试程序中设置内部变量.但我想强烈反对普通用户调用此功能.(是的,一个坚定的用户可以捣乱任何东西......但我不想宣传有办法做错事.)
例如,能告诉Intellisense不显示该功能会很高兴.
我目前最好的解决方案就是将函数命名为:DangerousSet().
我还有其他选择吗?
跟进
我发现David B的答案对我的情况最有用.谢谢!
Mufasa建议使用反射很好,但更难实现(对我而言).
克里斯建议使用装饰器很好,但没有成功.
BFree对XML的建议也很好,并且已经在使用,但并没有真正解决问题.
最后,BillTheLizard建议问题出现在源文档中,这不是我可以控制的.国际专家出版高度技术性的书籍和期刊文章供社区使用.他们没有满足我的特殊需求这一事实是生活中的事实.根本没有替代文件.
您可以使用InternalsVisibleToAttribute将内部成员标记为对测试程序集可见.在这种情况下使用它似乎很闪耀,虽然它不是"朋友".
标记你的DangerousSet
功能internal
而不是public
.
在项目的Properties\AssemblyInfo.cs中包含DangerousSet
:
[assembly:InternalsVisibleTo("YourTestAssembly")]
如果由于某种原因有两个测试程序集,则语法为:
[assembly:InternalsVisibleTo("TestAssembly1"), InternalsVisibleTo("TestAssembly2")]
使用此属性装饰您的方法:
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
这会将其隐藏在Intellisense之外.
编辑:
但显然这有一个相当重要的警告:"在Visual C#中,EditorBrowsableAttribute
不会在同一个程序集中禁止某个类的成员." 通过MSDN.