.NET平台开源项目速览今天介绍一款小巧强大的对象比较组件。可以更详细的获取2个对象的差别,并记录具体差别,比较过程和要求可以灵活配置。

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

本文地址:.NET平台开源项目速览(2)Compare .NET Objects对象比较组件

1.Compare .NET Objects介绍

Compare .NET Objects组件是.NET平台用于深入比较2个.NET对象的开源组件,一直在更新,主要功能如名字所示就是深入比较2个.NET对象,是否相等或者是否有差异。可能很多.NET对象实现了一些.NET自带的接口可以直接进行比较,但是这个组件比较的范围和功能更加广泛。例如:

可以比较默认的子节点;可以比较结构体;

可以比较IList对象;可以比较单维或者多维的数组对象;

可以比较枚举类型;可以比较IDictionary对象;

可以比较数据集,数据表,字典等等;

可以比较私有字段或者属性等等。。。。。。。。

Compare .NET Objects支持.NET 3.5及更高版本,同时也支持 Silverlight 5+, Windows Phone 8+, Windows RT 8+, Xamarin iOS, and Xamarin Android等环境。

还有很多,不一一列举,可以去官网详细了解。我们重点放在它的基本使用上面,本文就用几个例子带你走近它的世界。虽然简单,但更多复杂的功能可能会用于不同的业务场景,也许是你要的哦。。。该组件唯一的缺点是案例和文档不全面,所以我研究了一下用法,把常规的一些用法代码敲出来,给大家分享一下吧。

官方网站:http://comparenetobjects.codeplex.com/

    NuGet Package:http://www.nuget.org/packages/CompareNETObjects

2. Compare .NET Objects注意事项

在更好的使用Compare .NET Objects之前,需要搞清楚以下几个注意事项,可以让你走不少弯路,这几个要点也是翻译的官方网站的内容:

1.考虑到性能因素,Compare .NET Objects默认仅仅是检测第一个差异(就可以确认不是同一个对象),如果要比较多个不同点,需要手动设置Config.MaxDifferences到你需要的不同点数量的最大值;

2.在比较完成之后,对象差异不同点在Differences 列表 或者从DifferencesString 属性中获取;

3.默认情况下,是进行深度比较,如果只需呀执行浅比较,需要手动设置CompareChildren =false;

4.默认情况下,私有属性和私有字段是不比较的,如果需要进行比较,在比较之前要设置Config.ComparePrivateProperties 和Config.ComparePrivateFields 为true;

5.默认情况下,如果比较的2个对象的类型不同,是会抛出异常的,如果需要忽略这个因素,需要设置Config.IgnoreObjectTypes=true;

可见该组件的功能不仅完善,而且相对灵活,把你想要的和不想要的都灵活进行了考虑,通过设置不同的开关进行比较。

3.一个简单的使用案例

为了使得下面的源码介绍更清晰,先看一个简单使用的Demo,理解完Demo后,我们再反过来深入的介绍比较过程中的三大核心对象。理解了这三大核心对象,整个组件的逻辑和使用也基本清楚了。

3.1 首先定义一个Person类型

为了简单的比较,我们定义1个Person类型,包括名称,年龄和创建日期3个属性。如下面代码:

public class Person
{
public String Name { get; set; }
public Int32 Age { get; set; }
public DateTime DateCreated { get; set; }
}

3.2 比较测试Demo

首先要引用Compare-NET-Objects的dll,添加之后,要在Demo中添加命名空间的引用:

using KellermanSoftware.CompareNetObjects;

接下来就看核心的使用过程,看代码注释:

//创建比较对象的类型
CompareLogic compareLogic = new CompareLogic(); //创建2个不同的Person类型
Person person1 = new Person();
person1.DateCreated = DateTime.Now;
person1.Name = "Jorn";
person1.Age = 25; Person person2 = new Person();
person2.Name = "Greg";
person2.DateCreated = DateTime.Now;
person2.Age = 22; //设置比较对象的配置文件,最大不同点为3
compareLogic.Config.MaxDifferences = 3;             //获取比较结果,使用Compare方法
ComparisonResult result = compareLogic.Compare(person1, person2); //如果不相等,输出不同信息字符串
if (!result.AreEqual)
Console.WriteLine(result.DifferencesString);

如上面案例所示,整个过程有3个核心的相关对象和要点:

  1. CompareLogic对象的初始化;

  2. CompareLogic的配置设置的使用;实际上是ComparisonConfig类的设置

  3. 直接获取结果,并输出不同信息,实际是ComparisonResult的使用。

    上面只是一个简单的案例,要想深入了解使用,还得看看这3个主要对象的作用。

4.三大核心对象介绍

根据第3节的例子和过程,本节介绍3个核心类型的结构,在使用前搞懂他们的结构,可以更快的使用。由于本组件暂时没有提供帮助文档,所以我将这3个核心类的注释进行了翻译,并根据文章的注释手动制作一份CHM格式的帮助文档。

4.1 CompareLogic比较逻辑类

CompareLogic就是比较对象主要对象。它只包括2个核心的东西:

  1. 就是配置属性Config,这是个进行比较前最重要的设置,同时在CompareLogic初始化时,也可以使用ComparisonConfig传递参数进行初始化,这样就可以更简单,在某些情况下,不需要重复设置。采用统一的配置就可以了。如下面是的部分源代码:

    public class CompareLogic : ICompareLogic
    {
    /// <summary>默认的比较设置文件</summary>
    public ComparisonConfig Config { get; set; } /// <summary>默认构造函数</summary>
    public CompareLogic()
    {
    Config = new ComparisonConfig();
    } /// <summary>使用外部的比较设置对象来进行初始化</summary>
    /// <param name="config">外部设置对象</param>
    public CompareLogic(ComparisonConfig config)
    {
    Config = config;
    }
    ..........
    }
  2. 比较方法。返回一个ComparisonResult对象,这里设计到核心的比较方法的过程,就不追究了。

    所以上述Config属性我们在执行比较方法前,需要根据自己的需求进行设置,比如设置最大的不同数目等等。。比较方法很简单,核心在与返回的类型,接下来继续看。

4.2 ComparisonConfig比较配置类

比较配置类,在CompareLogic是作为一个属性,可以在程序中比较前进行设置的。其核心方法就是配置项目,例如,我将其核心代码贴出来,看一下,就一目了然了,这个组件要实现的不同条件下进行比较的效果和功能,就是靠这个配置来进行的。

/// <summary>
/// 时间日期类型不同(间隔)的最大毫秒数,默认为0:
/// 意思就是比较2个时间对象,差别在这个值以下,就认为是相同的,类似Double处理相等时的精度
/// </summary>
public int MaxMillisecondsDateDifference { get; set; } /// <summary>结构体比较的最大深度(比较子节点),默认为2</summary>
public int MaxStructDepth { get; set; } /// <summary>如果为true,遇到未知的对象类型时,将忽略,而不是直接抛出异常,默认为false,也就是抛出异常</summary>
public bool IgnoreUnknownObjectTypes { get; set; } /// <summary>如果为true,将跳过无效的索引。默认为false</summary>
public bool SkipInvalidIndexers { get; set; } /// <summary>在每个阶段比较后都显示记录,默认为false.这在调试很具有很深子节点的对象时非常有用</summary>
public bool ShowBreadcrumb { get; set; } /// <summary>比较中需要忽略的类型列表.默认比较多有的类型</summary>
public List<Type> ClassTypesToIgnore { get; set; } /// <summary>只需要比较的类型列表。默认是比较多有类型,如果设置这个列表,那将只比较这个列表中的类型</summary>
public List<Type> ClassTypesToInclude { get; set; } /// <summary>比较期间需要忽略的数据表名称,或者表列名称,属性,或者字段。对大小写敏感</summary>
/// <example>MembersToIgnore.Add("CreditCardNumber")</example>
public List<string> MembersToIgnore { get; set; } /// <summary>只比较列表中的名称,如数据表,列名称,属性或者字段,大小写敏感。和上面的类型处理类似。</summary>
/// <example>MembersToInclude.Add("FirstName")</example>
public List<string> MembersToInclude { get; set; }
...................

其他还有很多,详细看我提供的源代码。我对几个核心类进行了翻译,可以更快的进行使用和理解。

4.3 ComparisonResult比较结果类

比较结果也很重要,如果只是想简单的返回相等和不相等其实太容易了,这也是这个功能组件不一样的地方。它将结果和不同点都进行了考虑,可以在比较完成后查询到不同点这个对象,或者直接 的字符串,并将不同点的值也表现出来。使用它,主要注意3个 属性:

/// <summary>比较发现的不同点</summary>
public List<Difference> Differences { get; set; }
/// <summary>比较不同点,以字符串描述</summary>
public string DifferencesString{get ;}
/// <summary>如果相同则返回true</summary>
public bool AreEqual{get ;}

这在Demo代码中也有用到。调试的时候,大家看一看,如下图所示:

    今天的内容就介绍到此。

5.资源

  你可以从官方网站:http://comparenetobjects.codeplex.com/下载源代码。

  我文中的演示Demo及项目的翻译部分,这里也提供一个下载,日期是在2015-5-22下载的基础上修改的。

  我的下载地址:CompareNetObjects-150525.rar

  我手动制作了一个部分翻译后的组件帮助文档,如下图:

下载地址:Compare.NET组件CHM.rar ,童鞋们,下载后别忘记点赞哦。。。

.NET平台开源项目速览(2)Compare .NET Objects对象比较组件的更多相关文章

  1. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  2. .NET平台开源项目速览(5)深入使用与扩展SharpConfig组件

    上个月在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧  和 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 中都提到了SharpConfig组件,简单轻量级 ...

  3. .NET平台开源项目速览(4).NET文档生成工具ADB及使用

    很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧 ...

  4. .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践

    心情小札:近期换了工作,苦逼于22:00后下班,房间一篇狼藉~ 小翠鄙视到:"你就适合生活在垃圾堆中!!!" 晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14 ...

  5. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  6. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  7. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  8. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...

  9. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

随机推荐

  1. es6 数组的工具类

    根据Es6中map和Set的特性,实现了对array的分组和转换操作. exports.mapToObj = function (strMap) { let obj = Object.create(n ...

  2. Mongodb常用命令介绍

    查看命令的方式: 1.在shell中运行db.listCommands() 2.在浏览器中访问管理员接口:http://ipaddress:28017/_commands 下面介绍在Mongodb中最 ...

  3. JMF框架

    Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节.JMF  API的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求.在这篇文章中,我将向你介绍如何用很 ...

  4. Mac 终端 Linux 命令总结(简单命令)

    目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...

  5. redhat6 yum源配置

    第一次接触redhat系统,安装软件时,发现没有ubuntu的apt-get包管理器,自带的yum包管理器又什么都找不到,网上搜了好久,终于把yum配置好了,感谢博主们- 使用redhat系统自带的y ...

  6. Android事件分发传递

    一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev); 接收到触摸事件时,是否分发事件到下面的View 返回true:分发触摸事件 返回f ...

  7. liunx常用的命令

    计算机网络的主要优点是能够实现资源和信息的共享,并且用户可以远程访问信息.Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户登录到远程计算机上.传输文件和执行远程命令等. 本章介绍 ...

  8. centos上安装php运行环境

    可以参考,但我安装的过程不完全一样http://www.cnblogs.com/liulun/p/3535346.html 我先安装的apache,直接执行的yum -y install httpd ...

  9. js将数字转成大写中文

    <script type="text/javascript"> //主函数 function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/ ...

  10. 关于[super dealloc]

    销毁一个对象时,需要重写系统的dealloc方法来释放当前类所拥有的对象,在dealloc方法中需要先释放当前类中所有的对象,然后再调用[super dealloc]释放父类中所拥有的对象.如先调用[ ...