「擴展方法使您可以向現有類型「添加」方法,而無需建立新的派生類型、從新編譯或以其餘方式修改原始類型。」框架
也就是說你能夠對 int 、string、datatable等類型進行擴展,而使用時候不須要去修改或編譯類型自己的代碼。this
舉個例子:spa
例如我對LiteDataTable(這個類型是rafy框架的,你就當作是datatable類型就行),直接上代碼分析code
public static class DataConvertExtension { public static ConvertResult ToEntityList<T>(this LiteDataTable liteDataTable) where T : EntityRepository { var convertResult = new ConvertResult(); var entityType = typeof(T); var repo = RF.ResolveInstance<T>(); var entityMeta = repo.EntityMeta; var entiyType = entityMeta.EntityType; var entity = repo.New(); var list = repo.NewList(); var propertyList = entity.PropertiesContainer.GetCompiledProperties(); var columns = liteDataTable.Columns.Select(e => e.ColumnName).ToList(); #region 判斷liteDataTable是否和要轉換的實體列是否匹配 var nameList = new List<string>(); var canConvert = true; for (int i = 0; i < propertyList.Count; i++) { nameList.Add(propertyList[i].Name); } if (propertyList.Count == columns.Count) { for (int i = 0; i < propertyList.Count; i++) { var columnName = columns[i]; if (!nameList.Contains(columnName)) { canConvert = false; } } } #endregion if (canConvert) { foreach (var row in liteDataTable.Rows) { var entityItem = repo.New(); foreach (var property in propertyList) { var propertyName = property.Name; if (columns.Contains(propertyName)) { entityItem.LoadProperty(property, row[propertyName]); } } list.Add(entityItem); } } convertResult.Success = canConvert; convertResult.ResultList = list; return convertResult; } public class ConvertResult { public bool Success; public EntityList ResultList; } }
看了上面的代碼了吧,擴展方法規定類必須是一個靜態類,DataConvertExtension是一個靜態類,裏面包含的全部方法都必須是靜態方法。blog
msdn是這樣規定擴展方法的:「擴展方法被定義爲靜態方法,但它們是經過實例方法語法進行調用的。 它們的第一個參數指定該方法做用於哪一個類型,而且該參數以 this 修飾符爲前綴。」string
到時候調用的時候直接這樣就行it
1 LiteDataTable l = new LiteDataTable(); 2 3 l.ToEntityList(entity);