Compare .NET Objects对象比较组件
Compare .NET Objects对象比较组件
.NET平台开源项目速览今天介绍一款小巧强大的对象比较组件。可以更详细的获取2个对象的差别,并记录具体差别,比较过程和要求可以灵活配置。
本文地址:.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个属性。如下面代码:
|
1
2
3
4
5
6
|
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中添加命名空间的引用:
|
1
|
using KellermanSoftware.CompareNetObjects; |
接下来就看核心的使用过程,看代码注释:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//创建比较对象的类型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;//设置比较对象的配置文件,最大不同点为3compareLogic.Config.MaxDifferences = 3; //获取比较结果,使用Compare方法ComparisonResult result = compareLogic.Compare(person1, person2);//如果不相等,输出不同信息字符串if (!result.AreEqual) Console.WriteLine(result.DifferencesString); |
如上面案例所示,整个过程有3个核心的相关对象和要点:
CompareLogic对象的初始化;
CompareLogic的配置设置的使用;实际上是ComparisonConfig类的设置
直接获取结果,并输出不同信息,实际是ComparisonResult的使用。
上面只是一个简单的案例,要想深入了解使用,还得看看这3个主要对象的作用。
4.三大核心对象介绍
根据第3节的例子和过程,本节介绍3个核心类型的结构,在使用前搞懂他们的结构,可以更快的使用。由于本组件暂时没有提供帮助文档,所以我将这3个核心类的注释进行了翻译,并根据文章的注释手动制作一份CHM格式的帮助文档。
4.1 CompareLogic比较逻辑类
CompareLogic就是比较对象主要对象。它只包括2个核心的东西:
就是配置属性Config,这是个进行比较前最重要的设置,同时在CompareLogic初始化时,也可以使用ComparisonConfig传递参数进行初始化,这样就可以更简单,在某些情况下,不需要重复设置。采用统一的配置就可以了。如下面是的部分源代码:
12345678910111213141516171819publicclassCompareLogic : ICompareLogic{/// <summary>默认的比较设置文件</summary>publicComparisonConfig Config {get;set; }/// <summary>默认构造函数</summary>publicCompareLogic(){Config =newComparisonConfig();}/// <summary>使用外部的比较设置对象来进行初始化</summary>/// <param name="config">外部设置对象</param>publicCompareLogic(ComparisonConfig config){Config = config;}..........}比较方法。返回一个ComparisonResult对象,这里设计到核心的比较方法的过程,就不追究了。
所以上述Config属性我们在执行比较方法前,需要根据自己的需求进行设置,比如设置最大的不同数目等等。。比较方法很简单,核心在与返回的类型,接下来继续看。
4.2 ComparisonConfig比较配置类
比较配置类,在CompareLogic是作为一个属性,可以在程序中比较前进行设置的。其核心方法就是配置项目,例如,我将其核心代码贴出来,看一下,就一目了然了,这个组件要实现的不同条件下进行比较的效果和功能,就是靠这个配置来进行的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/// <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个 属性:
|
1
2
3
4
5
6
|
/// <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技术爱好者,彩票分析预测
Compare .NET Objects对象比较组件的更多相关文章
- .NET平台开源项目速览(2)Compare .NET Objects对象比较组件
.NET平台开源项目速览今天介绍一款小巧强大的对象比较组件.可以更详细的获取2个对象的差别,并记录具体差别,比较过程和要求可以灵活配置. .NET开源目录:[目录]本博客其他.NET开源项目文章目录 ...
- 26复杂类型比较,使用Compare .NET objects组件
关于比较对象,在"06判等对象是否相等"中大致可以总结为: 关于比较方法: ● 实例方法Equals(object obj)既可以比较值类型,也可以比较引用类型 ● 静态方法E ...
- .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...
- .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践
心情小札:近期换了工作,苦逼于22:00后下班,房间一篇狼藉~ 小翠鄙视到:"你就适合生活在垃圾堆中!!!" 晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14 ...
- Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
#pragma strict function Awake(){ //载入一个预制体 资源必须在 Resources目录下 Resources.LoadLoad(); //载入后 必须演示样例化 Ga ...
- Tiny Mapper是一个.net平台开源的对象映射组件
NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper 阅读目录 1.Tiny Mapper基本介绍 2.Tiny Mapper 基本使用 3.Tiny Mapper 指定配置使用 ...
- 游戏对象、组件和Prefabs
如标题所言,本文由3个部分组成,分别讲述游戏对象.组件和Prefabs(预设体). 1. 游戏对象 任何游戏对象都由组件组成,组件是实现一切功能所必需的.我们创建的对象会在Hierarchy视图中显示 ...
- 视图属性+对象动画组件ViewPropertyObjectAnimator
视图属性+对象动画组件ViewPropertyObjectAnimator ViewPropertyObjectAnmator组件是一款对象动画(ObjectAnimator)封装组件.它将视图属 ...
- django的queryset和objects对象
1. queryset是查询集,就是传到服务器上的url里面的内容.Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率. 也就是说,在你创建一个QuerySet对象的时候, ...
随机推荐
- MongoDB学习笔记-命令
连接数据库: mongodb://账号:密码@IP/库名 更多方式参考:http://www.runoob.com/mongodb/mongodb-connections.html 命令整理: 名称 ...
- Paint获取Text的宽和高的数据
获取字符串的宽度: public static float GetTextWidth(String text, float Size) { // 第一个参数是要计算的字符串,第二个参数是字提大小 Te ...
- WIZnet通过启动在线培训活动:计算机网络TCP/IP协议而事实上,现在的方法
为了给大家营造更好的学习环境.WIZnet特此举办第一期培训活动,由WIZnet一线project师为你分享最最前沿和有用的网络技术知识,帮你解答开发过程中的疑问.欢迎前来交流.名额有限(20名满), ...
- (ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询!
(ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询! 直接在源代码: 定义全局变量: int index=0; /// & ...
- 搭建 Linux 下 GitLab 服务器(转)
这两天因为项目需求需要搭建一个GitLab服务器,遇到了很多问题,参考了很多网络资料,终于搭建成功,在此把这个过程记录一下,利人利己. 一.最终目的 1,在Linux下创建GitLab服务器,客户端能 ...
- Apache Commons Math3学习笔记(2) - 多项式曲线拟合(转)
多项式曲线拟合:org.apache.commons.math3.fitting.PolynomialCurveFitter类. 用法示例代码: // ... 创建并初始化输入数据: double[] ...
- CentOS-6.5-x86_64 最小化安装后,怎样安装 man 程序?
CentOS-6.5-x86_64 最小化安装后.怎样安装man 程序? CentOS-6.5-x86_64 最小化安装后,没有man 程序,没它还真的不方便. man 是 manual(手冊)的意思 ...
- UVa 11069 - A Graph Problem
题目:给你一个集合{1,2,..,n},计算子集的个数,子集的元素不能相邻且不能再插入元素. 分析:dp,动态规划.相邻元素间仅仅能相差3或者2. 动态方程:f(k)= f(k-2)+ f(k-3): ...
- C# 使用WinRar命令压缩和解压缩
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- UVa 10491 - Cows and Cars
題目:有m+n個們,每個門後面有牛或者車:有n仅仅牛,m輛車,你選擇当中1個: 然後打開当中的k你沒有選中的門後是牛的,問你改變選時得到車的概率. 說明:數學題,概率.全概率公式就可以: 說明:第10 ...