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

    .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 ,童鞋们,下载后别忘记点赞哦。。。

时间: 2024-08-03 15:42:34

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

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

上个月在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧  和 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 中都提到了SharpConfig组件,简单轻量级,速度快,而且还有比较深入的使用介绍.在文章发布后,也有网友提到一些问题,当时我也没仔细去分析,在这次我亲自使用的过程中,就对几个问题进行了比较深入的研究,同时对不满足自己的地方,也进行了扩展.所以今天就把对SharpConfig的源码进行一个简单的分析,同时也根据需求对自己的一个特殊情况进行扩展.

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

原文:.NET平台开源项目速览(4).NET文档生成工具ADB及使用     很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧.例如本文在: .NET平台开源项目速览(2)Compare .NET Objects对象比较组件 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB 上述2篇文章中最后的资源中就手动制作了CHM帮助

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

    很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧.例如本文在: .NET平台开源项目速览(2)Compare .NET Objects对象比较组件 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB 上述2篇文章中最后的资源中就手动制作了CHM帮助文档.有时候我们还可以对源码进行翻译,再制作,效果还不错.今天介绍的A

.NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

原文:.NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB     今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门  2.[原创]C#开源轻量级对象数据库NDatabase介绍      上面2个数据库我的实际的项目中用过,还不错.当然数据量很小,主要是客户比较变态,必须要用xml文件保存,就想到了,另外NDatabase只是自己觉得好玩,也用了

.NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程

原文:.NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程 在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部分技术细节,我还没有在实际系统中大量使用,但文章发布后,有不少网友( loogn)反应在实际项目中使用过,效果还可以吧.同时也有人碰到了关于LiteDB关于分页的问题,还不止一个网友,很显然这个问题从我的思考上来

.NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几篇文章推荐给大家.最近在计算足球彩票结果组合过程中,使用的到了其功能,生成排列,非常具有代表性,而且也有网友咨询过类似的问题,所以就封装为扩展方法,方便调用.         NET开源目录:[目录]本博客其他.NET开源项目文章目录 彩票数据资料目录:[目录]C#搭建足球赛事资料库与预测平

.NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做深入研究,所以今天就通过一篇简单的文章来预览一下其强大的功能.本文曾在[原创].NET开源表达式计算组件介绍与使用一文中介绍过一个.NET平台开源的表达式计算组件NCal.不过经过比较还是这个Expression Evaluator比较强大,虽然部分功能有重叠.也都能计算常规的数学表达式.这个组件的

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

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上比较权威的,标准化的算法,所以还是安全可靠的.但也有一些场合,需要自己实现一些安全散列算法.不仅仅是学习,也可以进行测试以及相关研究.而今天要介绍的正式这样一个包括了目前几乎所有散列函数算法实现的.NET开源组件,大家可以实际使用,查看或者修改等.满足更多不同人,不同层次的需求.那就看看相关

[置顶].NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下FluentValidation验证组件.那里只是概述了一下,并没有对其使用和强大功能做深入研究,所以今天以及接下去的几篇文章就专门介绍这个组件.不仅仅是它小,轻量级,优雅,而且一直在持续更新中.本人对这个感触很深是源于4年前自己在做一个数据过滤软件时,自己也设计了一套验证过滤的东西,虽然勉强能用,但太复杂了,复杂到我看到就想吐...指导我遇到了FluentValidation,彻底颠