c# - 在 C# 中反射?

标签 c# wpf reflection

我最近从 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/

相关文章:

wpf - 显示非矩形文本 block

java - 使用 Swing 在 GUI 中显示类内容

c# - 更改 Int Array C# 中给定索引处的值

c# - 在不引用当前页面的情况下解析相对 ("~") 路径?

java - 如何在 Java 测试框架中隐藏页面对象初始化

c# - 在 C# 中使用枚举作为属性类

c# - 在鼠标位置(鼠标左上角)显示 WPF 窗口的最佳方法是什么?

wpf - 如何在一个集合上定义 2 个单独的过滤器?

go - 为什么这个测试使用 reflect.deepEqual 会失败?

java - 使用数组调用带可变参数的构造函数