1

“反射”是指使用 System.Reflection 命名空间。

MSDN 谈到 PrivateObject 类:“允许测试代码......”。与 System.Reflection 相比,我更喜欢 PrivateObject 语法,所以我想知道是否有真正的理由不在生产代码中使用它,而只保留它用于单元测试?

4

3 回答 3

6

我可以告诉您不在生产环境中使用 PrivateObject 的一个原因是需要将测试程序集 (Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll) 部署到生产服务器。那不是他们应该在的地方。但是,如果它不会损害您工作地点的任何政策,则由您决定是否使用它。

顺便说一句,PrivateObject 内部使用反射,所以无论如何你都要使用它。

我发现这个解决方案使用动态对象来调用私有成员(http://blogs.msdn.com/b/davideb/archive/2010/01/18/use-c-4-0-dynamic-to-drastical-simplify -your-private-reflection-code.aspx),因为您不喜欢 Reflection 的语法。也许你应该试试。

于 2013-09-04T17:06:11.233 回答
2

“真正的原因”是不属于您的项目的类的私有成员不打算由您的代码使用或修改。

来自维基百科

在编程语言中,封装用于指代两个相关但不同的概念之一,有时指的是它们的组合[1] [2]

  • 一种语言机制,用于限制对某些object组件的访问。[3] [4]
  • 一种语言结构,有助于将数据与操作该数据的方法(或其他功能)捆绑在一起。[5] [6]

这个故事的寓意是修改不属于您的类或组件的私有数据成员类似于未定义的行为。这意味着,如果您修改这些私有成员,任何事情都可能发生——它可能正常工作,可能会使您的应用程序崩溃,或者可能会格式化您的硬盘驱动器。

与其使用PrivateObject或反射来做你不应该做的事情,不如考虑寻找解决方法,向组件供应商请求特定功能,或使用不同的组件。

于 2013-09-04T16:48:39.443 回答
1

你不能PrivateObject用来实际反映一个类型。换句话说:您不能使用它来获取类型的成员。
只有事先知道成员的姓名才能使用它。

也就是说,如果这些限制在您的场景中无关紧要,我看不出您不应该被允许使用它的原因。
该类是public,有据可查,不被弃用。

于 2013-09-04T16:41:35.023 回答