Compare.NET Objects對象比較組件

.NET平台開源項目今天介紹一款小巧強大的對象比較組件。可以更詳細的獲取2個對象的差別,並記錄具體差別,比較過程和要求可以靈活配置。

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等環境。

還有很多,不一一列舉,可以去官網詳細了解。我們重點放在它的基本使用上面,本文就用幾個例子帶你走近它的世界。雖然簡單,但更多複雜的功能可能會用於不同的業務場景,也許是你要的哦。。。該組件唯一的缺點是案例和文檔不全面,所以我研究了一下用法,把常規的一些用法代碼敲出來,給大家分享一下吧。

官方網站:comparenetobjects.codeplex.com

NuGet Package:nuget.org/packages/Comp

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;//設置比較對象的配置文件,最大不同點為3compareLogic.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; } ..........}

比較方法,返回一個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.資源

  你可以從官方網站:comparenetobjects.codeplex.com下載源代碼。

  我文中的演示Demo及項目的翻譯部分,這裡也提供一個下載,日期是在2015-5-22下載的基礎上修改的。

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

  我手動製作了一個部分翻譯後的組件幫助文檔,如下圖:

下載地址:Compare.NET組件CHM.rar ,童鞋們,下載後別忘記點贊哦。


推薦閱讀:

ASP.NET開源以後會有更多的網站選擇這個平台么?
微軟開源 .NET 和其他相關項目會造成什麼影響?
c#編程語言在遊戲領域有什麼相關技術?
C# 是使用引用計數來發現垃圾對象的嗎?
Windows的哪些組件使用了.Net、WPF或Silverlight開發?

TAG:NET | 開源項目 | oschina開源中國 |