c#中的扩展方法

简介: c#中的扩展方法

引言


最近项目中的业务逻辑比较复杂,所以需要我们在写代码的时候尽量的简单,这样在大组长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#中的扩展方法能给我们带来的好处不仅仅是代码易读性方面的,还有很多的好处,需要我们读者自己在项目中体会,在这小编就是给大家介绍我们如何在项目中使用扩展方法,以及我们在什么情况下使用。




目录
相关文章
|
8月前
|
编译器 C#
c# 自定义扩展方法
c# 自定义扩展方法
EntityFramework——委托与Lambda表达式
EntityFramework——委托与Lambda表达式
110 0
EntityFramework——委托与Lambda表达式
|
开发框架 .NET C#
面向对象——扩展方法
面向对象——扩展方法
120 0
|
C# .NET 开发框架