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);