.NET平台開源項目速覽今天介紹一款小巧強大的對象比較元件。可以更詳細的擷取2個對象的差别,并記錄具體差别,比較過程和要求可以靈活配置。
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等環境。
還有很多,不一一列舉,可以去官網詳細了解。我們重點放在它的基本使用上面,本文就用幾個例子帶你走近它的世界。雖然簡單,但更多複雜的功能可能會用于不同的業務場景,也許是你要的哦。。。該元件唯一的缺點是案例和文檔不全面,是以我研究了一下用法,把正常的一些用法代碼敲出來,給大家分享一下吧。
在更好的使用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;
可見該元件的功能不僅完善,而且相對靈活,把你想要的和不想要的都靈活進行了考慮,通過設定不同的開關進行比較。
為了使得下面的源碼介紹更清晰,先看一個簡單使用的Demo,了解完Demo後,我們再反過來深入的介紹比較過程中的三大核心對象。了解了這三大核心對象,整個元件的邏輯和使用也基本清楚了。
為了簡單的比較,我們定義1個Person類型,包括名稱,年齡和建立日期3個屬性。如下面代碼:
首先要引用Compare-NET-Objects的dll,添加之後,要在Demo中添加命名空間的引用:
接下來就看核心的使用過程,看代碼注釋:
如上面案例所示,整個過程有3個核心的相關對象和要點:
CompareLogic對象的初始化;
CompareLogic的配置設定的使用;實際上是ComparisonConfig類的設定
直接擷取結果,并輸出不同資訊,實際是ComparisonResult的使用。
上面隻是一個簡單的案例,要想深入了解使用,還得看看這3個主要對象的作用。
根據第3節的例子和過程,本節介紹3個核心類型的結構,在使用前搞懂他們的結構,可以更快的使用。由于本元件暫時沒有提供幫助文檔,是以我将這3個核心類的注釋進行了翻譯,并根據文章的注釋手動制作一份CHM格式的幫助文檔。
CompareLogic就是比較對象主要對象。它隻包括2個核心的東西:
就是配置屬性Config,這是個進行比較前最重要的設定,同時在CompareLogic初始化時,也可以使用ComparisonConfig傳遞參數進行初始化,這樣就可以更簡單,在某些情況下,不需要重複設定。采用統一的配置就可以了。如下面是的部分源代碼:
比較方法。傳回一個ComparisonResult對象,這裡設計到核心的比較方法的過程,就不追究了。
是以上述Config屬性我們在執行比較方法前,需要根據自己的需求進行設定,比如設定最大的不同數目等等。。比較方法很簡單,核心在與傳回的類型,接下來繼續看。
比較配置類,在CompareLogic是作為一個屬性,可以在程式中比較前進行設定的。其核心方法就是配置項目,例如,我将其核心代碼貼出來,看一下,就一目了然了,這個元件要實作的不同條件下進行比較的效果和功能,就是靠這個配置來進行的。
其他還有很多,詳細看我提供的源代碼。我對幾個核心類進行了翻譯,可以更快的進行使用和了解。
比較結果也很重要,如果隻是想簡單的傳回相等和不相等其實太容易了,這也是這個功能元件不一樣的地方。它将結果和不同點都進行了考慮,可以在比較完成後查詢到不同點這個對象,或者直接 的字元串,并将不同點的值也表現出來。使用它,主要注意3個 屬性:
這在Demo代碼中也有用到。調試的時候,大家看一看,如下圖所示:

今天的内容就介紹到此。
我文中的示範Demo及項目的翻譯部分,這裡也提供一個下載下傳,日期是在2015-5-22下載下傳的基礎上修改的。
我手動制作了一個部分翻譯後的元件幫助文檔,如下圖: