zoukankan      html  css  js  c++  java
  • .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代码中也有用到。调试的时候,大家看一看,如下图所示:

    blob.png

        今天的内容就介绍到此。

    5.资源

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

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

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

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

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

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_CompareNet.html
Copyright © 2011-2022 走看看