.net 为什么我要在商业应用程序中使用反射?

.net 为什么我要在商业应用程序中使用反射?,.net,reflection,.net,Reflection,我知道什么是反射,但为什么我需要在典型的Winforms应用程序业务线中使用它?一个常见的场景是通过程序集进行反射,以查找、加载和使用应用程序的插件 我们还在工厂模式中广泛使用反射。对象创建方法可以用属性标记,这些属性通过反射找到,然后由我们的工厂创建 事实上,属性的任何使用都使用反射。如果您创建自己的属性,您将使用反射在代码中查找它们 我们还使用反射来生成代码。我们有一个使用.NET远程处理的客户机/服务器应用程序。我们使用自己的属性将调用标记到服务器中,然后使用反射来查找它们并生成所有通信代

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

一个常见的场景是通过程序集进行反射,以查找、加载和使用应用程序的插件

我们还在工厂模式中广泛使用反射。对象创建方法可以用属性标记,这些属性通过反射找到,然后由我们的工厂创建

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


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

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

这是一个很难回答的问题,但我想到了一些原因:

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

  • 当只有属性名可用时,使用它使用linq动态排序

  • 动态填充对象的属性。可能是因为您正在将属性与datarow列名匹配,也可能是与xml元素匹配。(可能是过时的用法)

  • 动态创建类


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


      也就是说,您可以编写一个简单的shell,方法是使用大量的if语句来匹配命令,或者使用反射生成一个字典,其中包含标记有特定自定义属性的方法的委托,以便向用户公开。使用反射方法,这种方法只需在一个地方添加,其余部分由反射处理。

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

      我已为我的枚举定义了一个DisplayName属性,因此您可以以以下内容结束:

      枚举 { [显示名称(“打开”) 打开 [显示名称(“报价请求”) 询价

      }

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


      如果我想根据类型处理某个东西,我将使用反射。因此,如果我传递了类型A,请向左,否则请向右。

      它使工厂模式非常易于扩展,因为您可以将信息放入配置文件或数据库中(工厂本身将成为您永远不必接触的代码)。

      假设为“业务线应用程序”你的意思是“一个简单的CRUD应用程序”,然后你已经将范围定义得足够窄,以至于你可能不需要反射来使它工作——或者甚至使它更好

      反射使语言“封闭”,因为语言中的运算符可以用来调查语言中的运算符;与C语言相比,C语言没有反射。要在C语言中按名称调用函数吗?不能这样做,没有反射

      典型的C应用程序需要这样做吗?没有,或者很少

      同样,根据您的问题“我为什么要在业务应用程序中使用反射?”的回答是,您可能不会,而其他人可能会巧妙地使用反射,但事实上,对于基本CRUD应用程序来说,反射不是“必要的”


      这并不意味着你不应该理解它;知道它是什么以及它能做什么,就意味着在你遇到比“业务线应用程序”更困难或更复杂的事情时,编写大量脆弱的代码或一点优雅的反射代码是有区别的;-)

      以下是众多示例中的一部分:

      • 在与.NET反射一起使用的.NET反转控制容器中自动发现和加载组件和服务
      • 使用基于Cecil的反射()
      • 在代码中添加健全性和验证检查,使代码更加稳定,使用基于IL的反射()实现帮助程序
      • 使用基于Linq表达式的.NET反射()将UI控件和错误提供程序绑定到业务对象和业务规则
      可能使用:

      • 手工
      • 序列化,内置或
      • 数据绑定
      • 数据导入/导出,例如通过
      • 动态代码生成(
        Reflection.Emit

      如果您想实现工厂模式,避免每次在工厂中添加新组件时都必须重新编译代码,反射可能是唯一的选择。

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

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

      我们使用反射可以将UI层中的控件直接映射到数据层中业务对象的属性。这样,您就可以在某个地方的基表单上使用“通用”函数,使用UI数据“自动填充”BO,反之亦然,而无需为for上的每个控件和属性编写代码m和object.

      所有有效点,我都可以看到它的用途,例如,我正在编写一个单元测试框架或其他东西,但在公司环境中的LOB应用程序方面?我不认为这是重复的,我的问题非常具体,我不想找一本通用的入门书。我同意,投票赞成重新打开。U