PrivateObject,而不是反思在生产代码(PrivateObject instead of

2019-10-18 14:23发布

通过“反思”我的意思是使用System.Reflection命名空间。

MSDN说,有关的PrivateObject类:“允许测试代码...”。 我喜欢PrivateObject的语法比的System.Reflection多一个,所以我不知道有没有真正的理由不使用它在生产代码,并保持它只是单元测试?

Answer 1:

不能使用PrivateObject实际上反映了一个类型。 换句话说:你不能用它来获得一个类型的成员。
如果你事先知道成员的姓名,只能使用它。

这就是说,我不明白了一个道理,为什么你不应该被允许使用它,如果这些限制不会在您的方案无关紧要。
类是public的,有据可查,不建议使用。



Answer 2:

其中一个原因,我可以给你不是在生产环境中使用PrivateObject是部署测试组件(Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll)到生产服务器的需求。 这不是他们应该待的地方。 但是,如果不从你的工作场所受到伤害的任何政策,这是由你来决定使用与否。

顺便说一句,PrivateObject内部使用反射,所以你还是要用它。

我发现这个解决方案中使用动态对象调用私有成员( http://blogs.msdn.com/b/davidebb/archive/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify -您-私人-反射code.aspx ),因为你不喜欢思考的语法。 也许你应该尝试一下。



Answer 3:

“真正的原因”是一类,它是不是你的项目的一部分的私有成员并不意味着要使用或代码修改。

从维基百科 :

在编程语言中, 封装用于指两种相关但不同的概念之一,有时该组合[1] [2]物:

  • 语言机制,限制对某些的访问对象的组件。 [3] [4]
  • 一种语言构成便于与所述数据的捆扎方法上的数据操作(或其他功能)。 [5] [6]

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

而不是使用的PrivateObject或反射做一些你不应该做的事情,你应该考虑找一个解决办法,从组件供应商请求特定的功能,或者使用不同的组件。



文章来源: PrivateObject instead of Reflection in a production code
标签: c# reflection