我最近从 Java Web 开发人员转变为 C# 应用程序开发人员,主要开发 WPF 应用程序。我曾经将 Spring MVC 与 Java 一起使用,其中很多代码结构都是为我抢占和设置的。由于我已经过渡到 WPF,我的应用程序依赖于我设置可重用、解耦代码的能力。
我一直在努力提高我在某些设计领域的技能,包括泛型、设计模式和反射。
我很清楚所有这些是什么,对于泛型和设计模式,我相当擅长应用我认为的最佳实践(尽管这还悬而未决)。
我不太熟悉的是反射。我知道什么是反射,我知道如何用它来完成动态程序集加载、方法和类调用等任务。
我不明白的是这可能如何帮助我的例子。
我经常听说如果您知道如何使用反射,它会非常有用。当我尝试研究该主题时,我只找到教程和如何做的引用,而不是它可以用于的好处。
我的问题是,作为一名 WPF 开发人员,在使用反射时我能看到什么对我有帮助,和/或有什么地方或引用可以给我更多的东西,而不仅仅是使用反射的语法,而且是真实的世界范例和/或最佳实践?
最佳答案
反射是一个强大的 API。在基本层面上,反射允许您:
- 检查程序集中包含的类型
- 检查给定类型的成员,包括元数据(通过属性)
- 动态调用这些成员
如果您在 WPF 中使用绑定(bind)机制绑定(bind)到普通业务对象,那么您已经在使用反射。绑定(bind) API 在寻找更正式的绑定(bind)机制(继承自 DependencyObject
,具有自定义类型描述符等)后,将使用反射来获取和设置业务对象(或 View 模型)。
例如,假设你有这个类
公共(public)类客户 { 公共(public)字符串名称 { 得到;放; }
并且您的 WPF 控件( View )绑定(bind)到这些 Customer
对象的集合,并且具有绑定(bind)到 Name
属性的标签控件。所有这些都在 XAML 中定义,但在运行时代码看起来像这样:
var value = dataObject.GetType().GetProperty("Name").GetValue(dataObject, null);
这将从绑定(bind)对象中获取值——无需了解其类型——并允许控件以适当的方式显示它。同样:
dataObject.GetType().GetProperty("Name").SetValue(dataObject, "Bob", null);
会将该对象的属性值设置为 "Bob"
,同样不知道其类型。
至于它如何直接帮助您,用例相对较少。如果您发现自己需要使用反射来完成您需要的工作,您可能需要考虑重构代码;与通过反射使用动态调用相比,使用遵循静态类型的代码总是更好(在像 C# 这样的静态类型语言中)。虽然元数据检查相当便宜,但与通过普通方式调用成员相比,通过反射调用成员需要更多的处理。
简短的回答是,老实说,如果您要问它如何帮助您,最好假设——目前——它不能。
关于c# - 在 C# 中反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5128644/