【问题标题】:Is reflection the better way to compare two objects of the same type?反射是比较相同类型的两个对象的更好方法吗?
【发布时间】:2012-08-01 18:06:38
【问题描述】:

背景:

我有 2 个相同类型的对象实例。一个对象填充了我连接到的设备的配置,另一个对象填充了我存储在硬盘驱动器上的配置版本。

用户可以改变任何一个,所以我想比较它们并向用户展示差异。

每个对象都包含许多 ViewModel 属性,所有这些属性都扩展了ViewModelBase,这是我要比较的那些。

问题:

比我要提议的方法更好。

我正在考虑使用反射来检查我的对象中的每个属性,对于每个扩展 ViewModelBase,我将遍历每个属性。对于任何不同之处,我会将名称和值放入一个列表中,然后将其呈现给用户。

与其发明这个轮子,我想知道这是不是以前解决过的问题?有没有更好的方法来完成它?

【问题讨论】:

  • 嗨,Marc,我看到您在评论中说“对于单个项目,还不错。列表很痛苦”。不幸的是,ViewModelBase 包含许多ObservableCollection 列表。这是否否定了您的建议的效用?
  • 好吧,那么您不再是在谈论“两个对象”,因此这与您所问的问题不同;p 但是:在相同的答案上,还有另一篇带有 codeplex 建议的帖子做一些更复杂的事情。

标签: c# wpf reflection


【解决方案1】:

根据要比较的属性数量,手动检查将是更有效的选择。但是,如果您有很多属性或希望检查是动态的(即您只需添加新属性并且它会自动工作),那么我认为反射是这里的方法。

【讨论】:

    【解决方案2】:

    为什么不为您的类型实现等于运算符?

    http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

    编辑:仔细阅读后,我知道您实际上要问的是进行实际比较的最有效方法是什么。

    通过反射来节省代码,但速度较慢。使用大量手动比较来做这件事相当快,但需要更多代码。

    【讨论】:

    • 这并不能真正回答“有没有更好的方法来完成它”这个问题——覆盖Equals 方法并不意味着你没有必须比较属性。虽然我同意这是一个更适合进行比较的地方。
    【解决方案3】:

    如果你是相当威慑和懒惰的好方法。您可以混合使用这两种解决方案的优点。借助cci 之类的工具,您可以发出比较属性的方法。这样做的好处是您的反射代码将在编译时执行,让您在运行时执行严格的转发方法。这使您可以根据需要更改模型,而不必担心比较代码。这样做有一个缺点,那就是学习 cci,这非常具有挑战性。

    【讨论】:

    • 对于在运行时工作,Reflection.EmitExpression 肯定是更明智的选择吗?
    • 是的,但是您将在运行时而不是编译时生成代码,这是额外的开销,但它比反射更好。
    • 因此将生成的代码存储在动态委托中。我的解决方案对任何生成的代码都这样做。
    • 我不允许这一代每个类型执行一次以上,但这是运行时的开销。这完全取决于要解析以生成所有方法的类型的数量。如果它们很少,那么开销可能可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2013-07-26
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多