引言
最近项目中的业务逻辑比较复杂,所以需要我们在写代码的时候尽量的简单,这样在大组长review代码的时候
才比较容易通过,所以一些基本知识现在就先的比较重要了,在数据筛选的时候小编就给一个类写了一个扩展方法,
当时也是找了一些资料。其实这个东西是非常简单的,但是我们掌握了以后会让我们写出比较好的代码。
按MSDN的定义——扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他
方式修改原始类型。这里的“添加”之所以使用引号,是因为并没有真正地向指定类型添加方法。
下面我们先来看一个小Demo:
public static class Extensions
{
public static int TestMethod(this string s)
{
return s.Length;
}
}
用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#中的扩展方法能给我们带来的好处不仅仅是代码易读性
方面的,还有很多的好处,需要我们读者自己在项目中体会,在这小编就是给大家介绍我们如何在项目中使用扩展方
法,以及我们在什么情况下使用。