在C#中用静态类来扩展类的方法
在C#中用静态类来扩展类的方法
1.待扩展类
private IList<Person> _personList;
[SetUp]
public void Setup()
{
_personList = new List<Person>();
_personList.Add(new Person() { FirstName="Daniel", LastName = "Day-Lewis", YearBorn = 1957 });
_personList.Add(new Person() { FirstName = "Sally", LastName = "Field", YearBorn = 1946 });
_personList.Add(new Person() { FirstName = "David", LastName = "Strathairn", YearBorn = 1949 });
_personList.Add(new Person() { FirstName = "Joseph", LastName = "Gordon-Levitt", YearBorn = 1981 });
_personList.Add(new Person() { FirstName = "James", LastName = "Spader", YearBorn = 1960 });
}
从上面代码看出其通过接口IList定义为List类型。
2.用于扩展的静态类中的静态方法
public static class Extensions
{
/// <summary>
/// creates an epplus worksheet from a list
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="rows"></param>
/// <param name="name"></param>
/// <returns></returns>
public static ExtensionWorksheet<T> ToWorksheet<T>(this IList<T> rows, string name, Action<ExcelColumn> configureColumn = null, Action<ExcelRange> configureHeader = null, Action<ExcelRange> configureHeaderRow = null, Action<ExcelRange, T> configureCell = null)
{
var worksheet = new ExtensionWorksheet<T>()
{
Name = name,
Workbook = new ExtensionWorkbook(),
Rows = rows,
Columns = new List<ExtensionColumn<T>>(),
ConfigureHeader = configureHeader,
ConfigureColumn = configureColumn,
ConfigureHeaderRow = configureHeaderRow,
ConfigureCell = configureCell
};
return worksheet;
}
}
this IList rows表示用this关键字来扩展泛型List的方法
3 静态扩展方法的调用
var package = _personList.ToWorksheet("Actors");
4 适用场景
很多时候作用效果跟lambda(拉姆达)表达式很类似。就是需要传入很多参数,或者需要调用很多方法的时候。代码会变得很多,可读性会变差,可操作性也会变复杂,扩展性会变差。比如当操作EXCEL导出的时候,样式会有方法,Mapper数据库会有方法,保存会有方法,传入worksheet会有方法,传入标题会有方法,用了静态类扩展为list的方法,可读性会很好,可扩展性好,操作性佳。如果不这么操作,缺点就是需要示例化多个对象方法,然后原生的excel对象还需要在这几个不同对象的方法之间传递,非常的不方便。
如下示例
var bytes = yourListOfT.ToWorksheet("Title", configureHeader: f =>
{
f.Style.Fill.PatternType = ExcelFillStyle.Solid;
f.Style.Fill.BackgroundColor.SetColor(blue);
f.Style.Font.Color.SetColor(Color.White);
f.Style.Font.Name = "Tahoma";
f.Style.Font.Bold = true;
f.Style.Font.Size = 10;
f.Style.VerticalAlignment = ExcelVerticalAlignment.Top;
f.Style.WrapText = true;
}, configureColumn: f => f.AutoFit())
.ToXlsx();
5 小结
在C#中用静态类来扩展类的方法,非常实用于代码的封装,以后要尽可能地多用这个技巧。
在C#中用静态类来扩展类的方法的更多相关文章
- Kotlin(2): 优雅地扩展类的方法和属性
欢迎Follow我的GitHub, 关注我的CSDN. 个人博客: http://www.wangchenlong.org/, 最新内容. Kotlin由JetBrains公司推出, 是兼容Java的 ...
- Django视图扩展类
Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...
- C#基础加强(2)之密闭类、静态类及扩展方法
密闭类 简介 密闭类是被 sealed 关键字修饰的类,密闭类不能有子类.一般只有系统的一些基本类声明为密闭类,例如 String 类. 相关面试题 是否可以编写一个类继承自 String 类? 我们 ...
- 第二篇 .NET高级技术之密闭类和静态类及扩展方法
1.密闭类是修饰为sealed的类, sealed不能有子类.一般只有系统中的一些基本类声明为sealed.面试题:是否可以编写一个类继承自String类? 答:不能,因为string被声明为了sea ...
- 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)
静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...
- C# 扩展类
C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...
- C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)
C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...
- C#中的扩展类的理解
扩展类是一种静态的一种类的调用方法,通过实例化进行调用.利用this进行指正该类,有参数的时候直接在后面追加参数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...
随机推荐
- UVa 12657 Boxes in a Line(应用双链表)
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...
- 解决关于archlinux升级至3.16.1,Xorg桌面环境无法进入的问题
[现象]有终端输入username,password后,桌面环境启动失败. [报错]log文件里显示: (EE) Fatal server error: (EE) xf86OpenConsole: V ...
- DDD实战12 值对象不创建表,而是直接作为实体中的字段
这里的值对象如下风格: namespace Order.Domain.PocoModels { //订单地址 //虽然是值对象 但是不继承ValueObject //因为继承ValueObject会有 ...
- 机器学习: Viola-Jones 人脸检测算法解析(二)
上一篇博客里,我们介绍了VJ人脸检测算法的特征,就是基于积分图像的矩形特征,这些矩形特征也被称为Haar like features, 通常来说,一张图像会生成一个远远高于图像维度的特征集,比如一个 ...
- js父窗体关闭,子窗体紧随
近来的.我们遇到了权限管理系统.由于权限管理系统与原系统的风格不符.打开一个全新的窗口.问题就来了.admin取消后,,权限管理形式不关闭.其他普通用户登录后.尚能经营权的管理形式. 简化问题:adm ...
- Unity3d 鼠标的事件GetMouseButtonDown()、GetMouseButton()、GetMouseButtonUp()
当鼠标按键按下时,返回一次true,后面參数0是左键,1是右键,2是中键 if(Input.GetMouseButtonDown(0)) Debug.Log("Pressed left cl ...
- Qt on Android 资源文件系统qrc与assets
使用 Qt 为 Android 开发应用时,有时我们的应用会携带一些资源文件,如 png . jpg 等,也可能有一些配置文件,如 xml 等,这些文件放在哪里呢?有两种方式:qrc和assets,咱 ...
- 编写可移植C/C++程序的要点(12条)
1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...
- Matlab随笔之插值与拟合(下)
原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...
- android 玩愤怒的小鸟等游戏的时候全屏TP失败
1.tp driver的tpd_down()和tpd_up()函数不需要进行报告id号码.自己主动顶级赛: 2.tpd_up()功能只需要报告BTN_TOUCH和mt_sync信息,其他信息未报告,如 ...