引言
最近项目中的业务逻辑比较复杂,所以需要我们在写代码的时候尽量的简单,这样在大组长review代码的时候才比较容易通过,所以一些基本知识现在就先的比较重要了,在数据筛选的时候小编就给一个类写了一个扩展方法,当时也是找了一些资料。其实这个东西是非常简单的,但是我们掌握了以后会让我们写出比较好的代码。
按MSDN的定义——扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。这里的“添加”之所以使用引号,是因为并没有真正地向指定类型添加方法。下面我们先来看一个小Demo:
public static class Extensions { public static int TestMethod(this string s) { return s.Length; } }
以上是对string基类整个类的扩展,也就是说如果一个变量为string类型,并在同一个命名空间中,就可以使用TestMethod方法,例如:
string s="hahahhahah!"; int len=s.TestMethod();
在之前我们遇到这样的需求的时候总是自己写一个方法来调用,但是我们采用中写法和之前的写法相比会比较简单一些,但是我们在项目中经常需要我们对现有类进行扩展,其实扩展方法也可以扩展类的方法,只不过把this修饰的类型改为自定义的类型即可。
从上面的例子中我们可以总结出以下两点:第一、扩展方法必须写在静态类里面;第
二、它们的第一个参数指
定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
下面看看在项目中如何对某个类进行扩展方法的编写:有一个大的会议申请实体类(MeetingApplation),其中包含项目列表和意见列表,我们需要从中取出每个委员对每个项目中意见。然后形成一个新的集合。
下面是我们需要对其扩展的类(部分代码):
using MCS.Library.OGUPermission; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Seagull2.Capital.WebApi { public class MeetingApplation { public MeetingApplation Clone() { return (MeetingApplation)this.MemberwiseClone(); } /// <summary> /// 会议项目 /// </summary> private List<MeetingProject> _meetingProject; public List<MeetingProject> MeetingProject { get { if (_meetingProject == null) _meetingProject = new List<WebApi.MeetingProject>(); return _meetingProject; } set { _meetingProject = value; } } /// <summary> /// 会议意见 /// </summary> private List<MeetingOpinion> _meetingOpinion; public List<MeetingOpinion> MeetingOpinion { get { if (_meetingOpinion == null) _meetingOpinion = new List<WebApi.MeetingOpinion>(); return _meetingOpinion; } set { _meetingOpinion = value; } } /// <summary> /// 会务人员 /// </summary> private List<UserInfo> _conferenceStaff; public List<UserInfo> ConferenceStaff { get { if (_conferenceStaff==null) _conferenceStaff = new List<UserInfo>(); return _conferenceStaff; } set { _conferenceStaff = value; } } } }
编写扩展方法的静态类:
using MCS.Library.OGUPermission; using MCS.Library.SOA.DataObjects; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Seagull2.Capital.WebApi { public static class MeetingHelper { public static List<MeetingSummaryProject> CopyMeetingProjectAndOpinion(this MeetingApplation meetingApplation) { return InnerCopyMeetingProjectAndOpinion(meetingApplation, null); } public static List<MeetingSummaryProject> CopyMeetingProjectAndOpinion(this MeetingApplation meetingApplation, string busiGroupCode) { return InnerCopyMeetingProjectAndOpinion(meetingApplation, busiGroupCode); } private static List<MeetingSummaryProject> InnerCopyMeetingProjectAndOpinion(MeetingApplation meetingApplation, string busiGroupCode) { List<MeetingSummaryProject> list = new List<MeetingSummaryProject>(); var projects = string.IsNullOrEmpty(busiGroupCode) ? meetingApplation.MeetingProject : meetingApplation.MeetingProject.Where(p => p.BusiGroupCode == busiGroupCode).ToList(); foreach (var project in projects) { MeetingSummaryProject data = new MeetingSummaryProject() { projectCode = project.projectCode, projectName = project.projectName, IsPassed = project.IsPassed }; data.MeetingOpinion = meetingApplation.MeetingOpinion.Where(p => p.ProjectCode == project.projectCode).ToList(); data.MeetingOpinion.MixMemberName(); list.Add(data); } return list; } } }
在其他地方引用:
public void Inital(MeetingApplation meetingApplation) { this.FileNumber = meetingApplation.FileNumber; this.FileTitle = meetingApplation.FileTitle; this.MeetingSummaryProject = meetingApplation.CopyMeetingProjectAndOpinion(); }
小结:
以上就是对c#中的扩展方法的一个简单的介绍,当然c#中的扩展方法能给我们带来的好处不仅仅是代码易读性方面的,还有很多的好处,需要我们读者自己在项目中体会,在这小编就是给大家介绍我们如何在项目中使用扩展方法,以及我们在什么情况下使用。