首页 > 代码库 > c# 扩展方法

c# 扩展方法

msdn的定义:

“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”

也就是说你可以对 int 、string、datatable等类型进行扩展,而使用时候不需要去修改或编译类型本身的代码。

举个例子:

例如我对LiteDataTable(这个类型是rafy框架的,你就当做是datatable类型就行),直接上代码分析


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是一个静态类,里面包含的所有方法都必须是静态方法。

msdn是这样规定扩展方法的:“扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。”

到时候调用的时候直接这样就行

1  LiteDataTable l = new LiteDataTable();
2 
3  l.ToEntityList(entity);

 

c# 扩展方法