Kellerman Compare .NET Objects:比较具有不同属性名称的不同类型的对象

Posted

技术标签:

【中文标题】Kellerman Compare .NET Objects:比较具有不同属性名称的不同类型的对象【英文标题】:Kellerman Compare .NET Objects: Comparing objects of different types with different property names 【发布时间】:2015-09-04 10:05:15 【问题描述】:

我正在比较两个不同类型的对象,它们的属性名称不同。例如,我有 foo.Surname 想与 bar.Lastname 进行比较。

有什么方法可以创建一个映射(比如在 ComparisonConfig 中),以便我可以告诉比较器这两个属性是相同的吗?

我可以将有问题的属性添加到忽略列表中,然后对该属性进行手动比较,但创建映射似乎会更简洁。

【问题讨论】:

我认为 automapper 可能允许这样做:automapper.org 实际上是 automapper 让我首先想到了这一点,它具有我想要的语法,但据我所知,你不能使用 automapper 来比较对象的内容,它只允许您在对象之间复制内容(并检查映射是否有效)? Defo 为自动映射器创建一个工作,创建第三种类型,将您拥有的两种类型映射到新类型,然后比较它们? 这很聪明@bUKaneer,我没想到。它仍然没有我理想中想要的那么整洁,但如果没有办法在本地做到这一点,它很可能是答案 【参考方案1】:

有点,我不确定这是否适用于您的要求。如果您的 foo 和 bar 类都共享一个键,这将起作用:

    var spec0 = new Dictionary<Type, IEnumerable<string>>();
    spec0.Add(typeof(ChildType), new string[]  "ChildKeyName" );
    spec0.Add(typeof(ParentType), new string[]  "ParentKeyName");

    List<Type> spec1 = new List<Type>();
    spec1.Add(typeof(ParentType));
    spec1.Add(typeof(ChildType));

    CompareLogic.Config.IgnoreCollectionOrder = true;

    CompareLogic.Config.ClassTypesToInclude = spec1;
    CompareLogic.Config.CollectionMatchingSpec = spec0;
    basicComparison.Config.MaxDifferences = int.MaxValue;
    ComparisonResult = basicComparison.Compare(NewObject, OldObject);

【讨论】:

以上是关于Kellerman Compare .NET Objects:比较具有不同属性名称的不同类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

.net 比较两个日期大小

notepad++ 安装compare插件

将 php 转换为 c#,将 curl 转换为 .net [关闭]

php ob_start()ob_end_flush和ob_end_clean()多级缓冲

ob_flush()和flush()和ob_implicit_flush(true)

leetcode 字符串处理Compare Version Numbers