c# - 为什么我们需要反射?

标签 c# asp.net .net reflection system.reflection

我在研究反射,我了解了一些,但我并没有了解与这个概念相关的所有内容。为什么我们需要反射(reflection)?哪些我们无法实现但需要反射(reflection)的事情?

最佳答案

反射支持的场景有很多,但我主要将它们分为两类。

  • 反射使我们能够编写分析其他代码的代码。

例如,考虑有关程序集的最基本问题:其中有哪些类型?程序集是自描述的,反射是将该描述呈现给其他代码的机制。

例如,假设您想编写一个程序,该程序采用一个程序集并以图形方式显示该程序集中各个类之间的关系,以帮助您理解该代码。有这样的工具。他们在 Visual Studio 中。 有人编写了这些工具。它们不是靠魔法出现的。反射是 .NET 框架中设计的一种机制,它使您或我或任何其他人能够编写能够理解代码的工具。

  • 反射使我们能够将编译时绑定(bind)移动到运行时。

假设您有一个静态方法Foo.Bar()。当您在程序中调用 Foo.Bar() 时,您可以 100% 确定您认为将要调用的方法实际上将被调用。我们将静态方法称为“静态”,因为可以静态地 理解从名称 Bar 到被调用代码的绑定(bind)——也就是说,无需运行程序。

现在考虑基类上的虚方法Blah()。当您调用 whatever.Blah() 时,您并不知道在编译时将调用哪个 Blah(),但您知道一些 没有参数的方法 Blah() 将在 some 类型上调用,该类型是 whatever 的运行时类型,并且该类型等于或派生自声明 Blah() 的类型。 (事实上​​你知道的更多:你知道它等于或派生自 whatever 的编译时类型。)虚拟绑定(bind)是动态绑定(bind)的一种形式,但它不是完全 动态。用户无法决定此调用应该针对不同类型层次结构上的不同方法。

反射使我们能够在运行时进行完全绑定(bind)的调用,如果我们愿意,完全基于用户的选择。我们付出了性能代价,并且失去了编译时类型安全性,但我们获得了灵 active ,可以在运行时 100% 决定调用什么代码。在某些情况下,这是一个合理的权衡。

关于c# - 为什么我们需要反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224794/

相关文章:

c# - I可查询。比较运算符(== 和 >=)的细节

c# - 重现异常:指定的参数超出有效值范围。参数名称:索引

.net - 有没有一种方法可以在不影响 .NET 中底层响应流的情况下检查 WebResponse?

asp.net - 升级到 ASP.NET MVC2 后 RenderPartial 损坏

c# - SetFocus 通过 JavaScript 从代码隐藏进行控制

c# - 我应该将全局常量存储在资源文件 (.resx) 中还是类中?

c# - 异步 CTP,单元测试 ViewModel 的异步方法

c# - Dotnet publish 在 Debug 目录而不是 Release 目录中寻找依赖项

c# - MVC 从 ReturnURL 获取 ID

c# - 如何确定某个位置的 .NET 应用程序实例是否正在运行?