C# 3.0 特性之擴展方法

今天,咱們來聊一聊C#的擴展方法。app

C# 3.0中爲咱們提供了一個新的特性—擴展方法。什麼是擴展方法呢?咱們看一下MSDN的註解:this

擴展方法使您可以向現有類型「添加」方法,而無需建立新的派生類型、從新編譯或以其餘方式修改原始類型spa

也就是說,咱們能夠爲基礎數據類型,如:String,Int,DataRow,DataTable等添加擴展方法,也能夠爲自定義類添加擴展方法。code

那麼,咱們怎麼向現有類型進行擴展呢?咱們再看看MSDN的定義:對象

擴展方法被定義爲靜態方法,但它們是經過實例方法語法進行調用的。 它們的第一個參數指定該方法做用於哪一個類型,而且該參數以 this 修飾符爲前綴。blog

從定義能夠看出,對現有類型進行擴展,需新建一個靜態類,定義靜態方法,方法的第一個參數用this指定類型ip

下面,咱們看一下例子,首先,我定義一個靜態類ObjectExtension,而後對全部對象都擴展一個ToNullString方法。若是對象爲空,就返回string.Emptyci

不然,返回obj.ToString ()。get

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Reflection;

namespace Amway.OA.MS.Common
{
    public static class ObjectExtension
    {
        public static string ToNullString ( this object obj )
        {
            if ( obj == null )
            {
                return string.Empty;
            }

            return obj.ToString ();
        }  
    }
}

那麼,咱們就能夠在像如下那樣進行調用:string

DateTime dt = DateTime.Now;
var value = dt.ToNullString();

假如,咱們在進行轉換過程當中,若是轉成不成功,咱們返回一個默認值,能夠編寫以下代碼:

 public static int ToInt ( this object obj, int defaultValue )
        {
            int i = defaultValue;
            if ( int.TryParse ( obj.ToNullString (), out i ) )
            {
                return i;
            } else
            {
                return defaultValue;
            }
        } 

public static DateTime ToDateTime ( this object obj, DateTime defaultValue )
        {
            DateTime i = defaultValue;
            if ( DateTime.TryParse ( obj.ToNullString (), out i ) )
            {
                return i;
            } else
            {
                return defaultValue;
            }
        }

同理,對於自定義類,也能夠進行方法擴展,以下,假如咱們新建類CITY

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace AVON.DMS.Model
{
    using System;
    using System.Collections.Generic;
    
    public partial class CITY
    {
        public decimal CITYID { get; set; }
        public Nullable<decimal> PROVINCEID { get; set; }
        public string ZIP { get; set; }
    }
}

咱們在靜態類中新建一個靜態方法,以下:

public static string GetZip(this CITY city,string defaultvalue)
        {
            string value = defaultvalue;
            if (city != null)
            {
                return city.ZIP;
            }
            else return value;
        }

這樣,每次新建類CITY時,就能夠調用擴展方法GetZip獲取當前類的ZIP值。

以上,是我對C#擴展類的理解,若有不正的地方,歡迎指正。謝謝。

今天寫到這裏,但願對您有所幫助,O(∩_∩)O哈哈~

相關文章
相關標籤/搜索