对象审核

本文关键字:对象 | 更新日期: 2023-09-27 18:19:25

目前,我们的应用程序中有一个相当庞大的对象审计系统,流程如下。。

-类实现接口

-接口强制类重写一些方法,以便将需要审核的属性添加到KeyValuePairs 列表中

-类还需要从键值对列表中重新创建对象状态

现在开发人员需要将所有这些添加到类中,而且我们的对象经常更改,所以我们不只是串行化类。

我想做的是使用属性将属性标记为可审核,然后自动执行所有操作,这样开发人员就不需要做任何事情了。

我的主要问题是-我知道人们总是说反思很慢,我们说话有多慢?通过查看类,查看属性的属性,然后执行任何必需的逻辑,我将获得什么性能提升

感谢的帮助

Ste,

对象审核

很难给出具体的答案,因为这取决于应用程序的足够性能。

反射比正常编译的代码慢,但当担心性能问题时,最好有一些有效的东西,然后使用评测来找到真正的性能瓶颈并进行优化。

过早的优化可能会导致代码更难维护,因此开发人员的工作效率会降低。

我会从使用反射开始,写一组好的单元测试,这样你就知道你的代码在工作。如果性能出现问题,您可以使用VisualStudio探查器来评测单元测试并发现瓶颈。

有一些库可以加快反射速度,或者如果反射速度较慢,可以使用表达式树来替换反射代码。

performance是否正常取决于您的应用程序上下文。所以很难说它对你来说是慢还是快,你应该自己试试。

很可能,imo,它会提供相当可接受的性能,但我不知道你会在哪里使用它。

就像我想到的其他解决方案一样,可能是:

  • Sqlite,保存key/value数据的位置
  • 面向方面编程(如PostSharp)在编译时生成数据

会尝试的第一件事是反射,就像你想的那样。

阅读Marc的回复,我建议Reflection应该可以满足大多数应用程序的需求。

在进行任何基本更改之前,我建议运行一个探查器来查找代码中的瓶颈。如果您确定反映/审核过程是主要的痛点,请使用IL Emit并重试。

反射是这里的方法。如果它太慢(测量!),你可以加入一点缓存,或者在最坏的情况下生成一个Expression<T>并编译它

你的问题有两个阶段:

  1. 找出你想要的属性,并返回它们的PropertyInfos列表。每个类型只需要这样做一次,然后你就可以缓存它。因此,这一步的性能无关紧要
  2. 使用PropertyInfo.GetValue获取每个属性的值

如果步骤2太慢,则需要在步骤1中生成一个表达式,手动编写代码的开销将减少到单个委托调用。