为什么我会在商业应用中使用Reflection?

时间:2009-01-13 19:36:22

标签: .net reflection

我知道什么是反射,但为什么我需要在典型的业务线Winforms应用程序中使用它?

13 个答案:

答案 0 :(得分:11)

一种常见的情况是通过程序集反映查找,加载和使用应用程序的插件。

我们还在工厂模式中广泛使用反射。对象创建方法可以使用带有反射的属性进行标记,然后由我们的工厂创建。

事实上,任何属性的使用都使用反射。如果您创建自己的属性,则将使用反射在代码中找到它们。

我们还使用反射来生成代码。我们有一个使用.NET远程处理的客户端/服务器应用程序。我们使用自己的属性将调用标记到我们的服务器中,然后使用反射来查找它们并生成所有通信代码,服务器组件和客户端组件。它节省了在任何地方手动添加相同的日志记录,定时和远程代码的所有工作。

答案 1 :(得分:4)

反射可以帮助您编写更多可维护的代码并减少某些特定任务的代码量。

即。您可以通过使用大量 if 语句来匹配命令来编写简单的shell,或者使用反射生成包含指向特定自定义属性的方法的委托的字典,以将其公开给用户。使用反射方法,这种方法只需要在一个地方添加,反射就可以完成其余的工作。

答案 2 :(得分:2)

这是一个有问题的问题,但有些原因浮现在脑海中:

  • 在单元测试中测试私有方法。

  • 当只有一个属性名称时,使用它与linq动态排序。

  • 即时填写对象的属性。可能是因为您将属性与数据行列名称匹配,或者可能与xml元素匹配。 (可能是过时的用法)

  • 动态创建课程。

答案 3 :(得分:2)

反射的另一个常见用途是序列化。 .Net在序列化对象时使用反射来查找类型信息。业务线应用程序可能希望提供自定义数据导入/导出功能,而通过反射进行序列化是实现此目的的一种方法。

答案 4 :(得分:2)

我为我的枚举定义了一个DisplayName属性,所以你以:

结尾

枚举 {  [DisplayName的( “打开”)  打开,  [DisplayName(“报价请求”)  RFQ

}

现在我可以使用反射来拉出正确的标签。这对于数据驱动的应用程序很方便。您还可以在其中放置资源键,以便进行本地化。

如果我想根据它的类型处理某些东西,我会使用反射。因此,如果我通过A型,则向左走,否则向右走。

答案 5 :(得分:1)

如果您碰巧使用它们,您可以根据您的DTO动态构建用户界面。

答案 6 :(得分:1)

它使Factory模式真正易于扩展,因为您可以将信息放入配置文件或数据库中(而Factory本身就成为您永远不必触摸的代码)。

答案 7 :(得分:1)

假设“业务线应用程序”是指“一个简单的CRUD应用程序”,那么你已经足够狭窄地定义了范围,你可能不需要反思来使其工作 - 甚至使其更好

反射使语言“封闭”,因为语言中的运算符可用于调查语言中的运算符;与C语言形成对比,后者没有反思。想在C中按名称调用函数吗?做不到,没有反思。

典型的C应用程序是否需要这样做?不,或很少。

同样根据您的问题“我为什么要在商业应用中使用Reflection?”答案是可能不会,而其他可能有巧妙的用途,但事实上对于基本的CRUD应用程序来说,它并非“必要”。

这并不意味着你不应该理解它;知道它是什么以及它能做什么可能意味着编写大量脆弱的代码或一些优雅的反射代码之间的区别,如果你遇到比“业务线应用程序”更困难或更复杂的东西;-)

答案 8 :(得分:1)

以下是许多样本中的一些:

  • 在我们与 .NET反射
  • 一起使用的.NET Inversion of Control Container中自动发现并加载组件和服务
  • 使用基于Cecil的反射(sample
  • 对代码实施设计约束(即“模型名称空间中的所有类必须是不可变的和可邮寄的”)
  • 为代码添加健全性和验证检查,以使用基于IL的反射(sample)实现的帮助程序使其更稳定。
  • 使用基于Linq表达式(sample)的.NET反射将UI控件和错误提供程序绑定到业务对象和业务规则

答案 9 :(得分:0)

可能使用:

答案 10 :(得分:0)

如果要实现Factory模式并避免每次在工厂中添加新组件时重新编译代码,Reflection可能是唯一的选择。

答案 11 :(得分:0)

我们在许多地方使用反射,包括:

  • 实现依赖注入和工厂模式
  • 序列
  • 通过类属性控制行为

答案 12 :(得分:0)

我们使用反射能够将UI层中的控件直接映射到数据层中业务对象的属性。这使得你可以在baseForm上使用UI数据“自动填充”BO,反之亦然,而无需为表单和对象上的每个控件和属性编写代码。