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#中的扩展方法能给我们带来的好处不仅仅是代码易读性


方面的,还有很多的好处,需要我们读者自己在项目中体会,在这小编就是给大家介绍我们如何在项目中使用扩展方


法,以及我们在什么情况下使用。


   

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g-Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值