什么是C#中的反射,有哪些好处。如何使用它获得好处。

45

我在 msdn 上读了一篇关于 反射 的文章,但我连它的好处和用法都没有理解10%。

请您能否提供一些简要概述,什么是反射以及如何从中受益。


可能存在重复问题:https://dev59.com/oXI-5IYBdhLWcg3wW2-p ... https://dev59.com/jXI-5IYBdhLWcg3wbXtN - Jens Granlund
可能是Reflection. What can we achieve using it?的重复问题。 - H H
大家好:我仍然不明白我如何受益。你们中的任何人都能引用一个最简单的例子来说明它在编码帮助方面使代码更具可重用性和功能方面的好处吗? - Shantanu Gupta
7个回答

54

反射允许您编写能够检查代码自身各个方面的代码。

它使您可以执行简单的操作,例如:

  1. 在运行时检查对象的类型(例如对typeof()的简单调用)

  2. 检查对象的属性以在运行时更改方法的行为(.NET中的各种序列化方法)

还可以执行更复杂的任务:

  1. 在运行时加载程序集,查找特定类,确定是否匹配给定接口,并动态调用某些成员。

前者是更常见的用法。后者对于开发人员在其应用程序中工作的插件架构或希望根据配置更改在运行时交换程序集的人非常有用。


14
反射是一种在运行时以编程方式发现类型的方法。这非常重要,因为.NET语言是强类型的。能够访问元数据非常有用。
现在很流行的一个大事情(流畅接口/适配器)严重依赖于反射。特别是静态反射非常重要。如果您想查看具体示例和关于静态反射的良好解释,请查看:

http://jagregory.com/writings/introduction-to-static-reflection/
http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/03/dynamic-reflection-versus-static-reflection.aspx

当然,这只是反射的一个小子集。如果您想了解更多关于反射的一般用法的信息,请查看Apress Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition,第16章。它深入探讨了.NET类型系统以及如何在库和运行时中使用它。

11

反射可以让您的代码在编译代码时不知道方法和属性的情况下调用它们。使用这个功能之一的内置类是XmlSerializer。您可以传递任何要转换为XML的对象给它。它使用反射询问对象的所有属性,然后能够创建一个包含所需元素以表示该对象的XML文档。


6

反射是类型提供自身信息的能力。例如,一个程序集可以告诉您它包含什么内容,一个类型可以告诉您它的方法、属性等等。

动态提供这些信息在许多方面都很有用。一个简单的例子是 Web 服务使用的元数据 - 当一个人“消费”一个 Web 服务时,为他们的客户端生成代理类。这个代理是从 WSDL 文档生成的,而这个文档通常是通过反射生成的类型元数据生成的。

另一个简单的例子是动态加载类型以执行某个工作单元。我参与过的一个项目利用反射从数据库中加载“规则”,以应用于系统中的输入。


1

反射帮助你进行元编程,这无疑是最酷的编程技术之一。搜索元编程以获取更多信息。


0

反射的好处之一是它允许您像 SQL 中的事务一样保存数据集设计器中的所有更改。


0
反射是在asp.net中可用的强大命名空间。通过使用它,我们可以在运行时创建动态对象并调用它。它主要用于开发框架类型的应用程序。

3
反射不是ASP.NET或任何其他.NET技术的一部分,它是在运行时调查程序集的能力,不管您使用的项目类型是什么。 - Shahar G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接