反射应该使用到什么程度?

2024-02-27

我们在项目中遇到了一个非常棘手的场景。我们在项目中使用了很多反射。

我们有 ..

  • 由属性和反射驱动的验证框架
  • 使用属性和反射将 DataRow 转换为实体对象的扩展方法,反之亦然。我们对 DataTable 和 EntityCollections 做了同样的事情。
  • IComparer 接口在通用 EntityComparer 类上实现,该类使用反射来比较两个实体对象。

与上面的场景一样,我们在应用程序的许多其他部分使用了反射。使用反射后,我们注意到应用程序通过反射花费了更多的处理周期。

我们的项目中应该在多大程度上使用Reflection?项目的哪些领域在处理方面受反射影响最大?哪里反射不会对性能产生任何影响?有使用 Reflection 的指南吗?


反射很强大,但也有缺点。一般来说,尝试在没有它的情况下进行编码 - 但它对于“框架”库非常有用,在“框架”库中,您对实际对象的了解很少/有限;例如:

  • ORM / DAL 工具(加载/保存任意数据)
  • 数据绑定
  • 序列化

临时反射会带来性能损失,但如果您打算这样做lots(在你的库中,并且在一个紧密的循环中)你可以缓解这种情况:

  • 通过使用Delegate.CreateDelegate http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx (as a typed代表;不要使用DynamicInvoke)
  • 通过编写动态IL
  • 通过使用Expression在.NET 3.5中

当然,任何这样的代码都应该被缓存和重用(您不想为每个调用都编译+执行;只是第一个 - 其余的应该只执行)。

或者有一些库对此进行了抽象;例如,超属性描述符 http://www.codeproject.com/KB/cs/HyperPropertyDescriptor.aspx将自定义 IL(用于成员访问)包装在熟悉的环境中PropertyDescriptorAPI - 使其非常快速但轻松。您的问题提到了数据表和实体;这听起来是lot like 上一个问题 https://stackoverflow.com/questions/564366#564373,我使用 HyperDescriptor 做了一些指标,并附有摘要(以毫秒为单位):

Vanilla 27179
Hyper   6997

所以我的“看法”是:

  • in the 应用;很少——通常作为最后的手段
  • in your 公共图书馆/图书馆;在适当的情况下(注意接口等在可能的情况下是更好的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射应该使用到什么程度? 的相关文章

  • 从 .resx 文件组获取所有可用区域性

    我需要以编程方式列出 resx 文件组中的可用区域性 但 ResourceManager 类似乎没有帮助 我可能有 Labels resx Labels fr FR resx Labels ro RO resx 等等 但是 我如何在运行时找
  • “指定的登录会话不存在。它可能已被终止。”尝试使用 WindowsIdentity.Impersonate 复制文件时

    我正在尝试将文件从共享点复制到 unc 路径 我正在使用以下代码 var id new WindowsIdentity email protected cdn cgi l email protection var p new Windows
  • 计算从给定日期开始的月份中的第几天?

    我正在努力寻找一种简单有效的解决方案来计算每月的工作日 例如 如果给定日期是第一个星期一Monday 5th March 2018然后我想获取接下来 6 个月每个月第一个星期一的日期 例如 Monday 2nd April 2018 and
  • 如何从 SOAP 响应中删除额外的结果标签

    我知道这个问题以前曾被问过 但我在任何地方都找不到答案 问题是我的 asmx 文件中有以下代码 namespace IrancellSmsServer SoapDocumentService RoutingStyle SoapService
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • 如何以一种形式发布两个或多个模型?

    我正在为一个项目开发互联网课程计划应用程序 该课程计划是根据以下模型构建的 使用数据库优先方法中的实体框架生成 public partial class Subject public int Id get set public string
  • VS2017在nuget包中将“Build Action”设置为“Content”

    我创建我的nuget包在gitlab使用以下命令行 nuget pack Prop Configuration Release OutputDirectory nuget REPONAME APPNAME APPNAME csproj 如果
  • 在我的网站上显示 Google Analytics(分析)仪表板

    我设置了一个 ASP NET 网站 并使用 Google Analytics 进行页面跟踪 我唯一不喜欢的是我必须离开我的网站 到 Google Analytics 网站 才能看到该报告 有什么方法可以使用他们拥有的所有 AJAX 在我自己
  • 如果浏览器在 asp .net 中关闭,请从浏览器中注销?

    我的要求有点复杂 用户正在使用 Web 浏览器访问数据库 而在访问数据库时 如果用户关闭活动页面而不是注销会话 该会话需要自动注销 有人可以指导我如何做这个吗 我在母版页中使用了jquery onbeforeunload 我收到消息离开页面
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 重写某些 .Net Framework 控件的绘制以更改其边框颜色?

    SCENARIO 我正在使用第三方 Windows 视觉主题 当我看到我的应用程序时 它看起来像这样 但是当我使用正常的Aero主题 它看起来到处都有可怕的白色边框 QUESTION 我知道应用程序中使用的配色方案取决于视觉风格 但是 我可
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • WCF 服务调用包装器

    为 WCF 服务调用创建包装器的最佳实践是什么 我认为有必要 为了在同一个地方监视所有呼叫 我正在考虑使用这种代码 这是正确的想法吗 RetType t ServiceExecutionContext
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • string.Empty 与 null。您使用哪一个?

    最近工作的同事告诉我不要使用string Empty设置字符串变量时但使用null因为它污染了堆栈 他说不做 string myString string Empty but do string mystring null 真的有关系吗 我
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error

随机推荐