.net 反射应在多大程度上使用?

.net 反射应在多大程度上使用?,.net,reflection,.net,Reflection,我们在一个项目中遇到了一个非常棘手的情况。在我们的项目中,我们使用了很多反思 我们有 属性和反射驱动的验证框架 使用属性和反射将数据行转换为实体对象的扩展方法,反之亦然。与我们对DataTable和EntityCollections所做的相同 在通用EntityComparer类上实现的IComparer接口,该类使用反射来比较两个实体对象 与上述场景一样,我们在应用程序的许多其他部分使用了反射。使用反射后,我们注意到应用程序使用反射进行了更多的处理周期 我们应该在多大程度上在项目中使用反射

我们在一个项目中遇到了一个非常棘手的情况。在我们的项目中,我们使用了很多反思

我们有

  • 属性和反射驱动的验证框架
  • 使用属性和反射将数据行转换为实体对象的扩展方法,反之亦然。与我们对DataTable和EntityCollections所做的相同
  • 在通用EntityComparer类上实现的IComparer接口,该类使用反射来比较两个实体对象
与上述场景一样,我们在应用程序的许多其他部分使用了反射。使用反射后,我们注意到应用程序使用反射进行了更多的处理周期


我们应该在多大程度上在项目中使用反射?在处理方面,项目中受反射影响最大的领域是什么?哪里的反射不会对性能产生任何影响?关于使用反射有什么指导原则吗?

如果鞋子合适,就穿上它。。。如果它解决了手头的问题,并且不会导致通过某种测试(最好是分析器)测量的过度处理,那么就不用担心了。有很多问题很容易通过反思来解决


关于决定不使用反射,我唯一的指导原则是使用反射来获取您通常无法访问的属性(即其他类中的私有属性)。

您的非功能性需求/QoS应该决定是否适合使用反射,以及我的评论、测试、测试、测试(单元、性能测试等)。如果您的客户对性能感到满意,我会说去做。正确使用它可以而且确实会带来一定的生产率提高


就我个人而言,我会选择尽可能不使用反射。

反射可以为扩展性和灵活性提供真正的好处。使用反射时会对性能造成影响,但这不会立即让你感到不快,特别是如果它给你带来更多好处的话。尽量少用反射,但不要认为使用反射会带来很大的伤害恩,你需要这样做。这篇文章在这方面很好:

我的建议是,总是先尝试找到面向对象的解决方案,而不是一有机会就诉诸于反射。反射可能更容易完成一些事情,但使用OO解决方案,代码通常会更有条理,并且您可以摆脱反射的开销


在我作为开发人员的几年中,我只使用过反射两次……第一次是访问某个私有变量以获取web请求的上载进度。第二次是在从数据读取器读取数据时动态创建对象实例,我后来很高兴用一个通用的解决方案来替换它。

反射功能强大,但它已经成功缺点。通常情况下,尝试不使用它进行编码-但它对于“框架”库非常有用,因为您对实际对象的了解很少/有限;例如:

  • ORM/DAL工具(加载/保存任意数据)
  • 数据绑定
  • 系列化
临时反射会造成性能损失,但如果您打算大量(在库中,并且在一个紧密的循环中)进行此操作,则可以缓解此问题:

  • 通过使用(作为键入的委托;不要使用
    DynamicInvoke
  • 通过编写动态IL
  • 通过在.NET 3.5中使用
    表达式
当然,任何这样的代码都应该被缓存并重复使用(你不希望每次调用都编译并执行;只有第一个——其余的都应该执行)

或者有一些库对此进行了抽象;例如,在熟悉的
PropertyDescriptor
API中封装了自定义IL(用于成员访问),使其非常快速但不费力。您的问题提到了数据表和实体;这听起来很像,我使用HyperDescriptor做了一些度量,其中包含摘要(以毫秒为单位):

所以我的“接受”:

  • 应用程序中;很少-通常作为最后手段
  • 在您的公共库中;如果合适(注意,接口等在可能的情况下更可取)

建议、测试、测试、测试,并确保您能够承受性能损失。我已经分析了一个客户端项目,并对其进行了故障排除,其中他们使用的是反射基数据映射器(定制)而且没有经过很好的测试,性能问题和bug很多。他们没有考虑到他们可能在多个表上有相同的字段名,并且使用多个表连接执行select*。猜猜会发生什么,呵呵。很好的代码项目文章,我使用了Delegate.CreateDelegate。
Vanilla 27179
Hyper   6997