.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 ,童鞋們,下載后別忘記點贊哦。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM