对象审核
本文关键字:对象 | 更新日期: 2023-09-27 18:19:25
目前,我们的应用程序中有一个相当庞大的对象审计系统,流程如下。。
-类实现接口
-接口强制类重写一些方法,以便将需要审核的属性添加到KeyValuePairs 列表中
-类还需要从键值对列表中重新创建对象状态
现在开发人员需要将所有这些添加到类中,而且我们的对象经常更改,所以我们不只是串行化类。
我想做的是使用属性将属性标记为可审核,然后自动执行所有操作,这样开发人员就不需要做任何事情了。
我的主要问题是-我知道人们总是说反思很慢,我们说话有多慢?通过查看类,查看属性的属性,然后执行任何必需的逻辑,我将获得什么性能提升
感谢的帮助
Ste,
很难给出具体的答案,因为这取决于应用程序的足够性能。
反射比正常编译的代码慢,但当担心性能问题时,最好有一些有效的东西,然后使用评测来找到真正的性能瓶颈并进行优化。
过早的优化可能会导致代码更难维护,因此开发人员的工作效率会降低。
我会从使用反射开始,写一组好的单元测试,这样你就知道你的代码在工作。如果性能出现问题,您可以使用VisualStudio探查器来评测单元测试并发现瓶颈。
有一些库可以加快反射速度,或者如果反射速度较慢,可以使用表达式树来替换反射代码。
performance
是否正常取决于您的应用程序上下文。所以很难说它对你来说是慢还是快,你应该自己试试。
很可能,imo,它会提供相当可接受的性能,但我不知道你会在哪里使用它。
就像我想到的其他解决方案一样,可能是:
- Sqlite,保存
key/value
数据的位置 - 面向方面编程(如PostSharp)在编译时生成数据
但我会尝试的第一件事是反射,就像你想的那样。
阅读Marc的回复,我建议Reflection应该可以满足大多数应用程序的需求。
在进行任何基本更改之前,我建议运行一个探查器来查找代码中的瓶颈。如果您确定反映/审核过程是主要的痛点,请使用IL Emit并重试。
反射是这里的方法。如果它太慢(测量!),你可以加入一点缓存,或者在最坏的情况下生成一个Expression<T>
并编译它
你的问题有两个阶段:
- 找出你想要的属性,并返回它们的
PropertyInfo
s列表。每个类型只需要这样做一次,然后你就可以缓存它。因此,这一步的性能无关紧要 - 使用
PropertyInfo.GetValue
获取每个属性的值
如果步骤2太慢,则需要在步骤1中生成一个表达式,手动编写代码的开销将减少到单个委托调用。