c# 擴展方法

msdn的定義:

「擴展方法使您可以向現有類型「添加」方法,而無需建立新的派生類型、從新編譯或以其餘方式修改原始類型。」框架

也就是說你能夠對 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);
相關文章
相關標籤/搜索