今天,我们来聊一聊C#的扩展方法。

C# 3.0中为我们提供了一个新的特性—扩展方法。什么是扩展方法呢?我们看一下MSDN的注解:

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型

也就是说,我们可以为基础数据类型,如:String,Int,DataRow,DataTable等添加扩展方法,也可以为自定义类添加扩展方法。

那么,我们怎么向现有类型进行扩展呢?我们再看看MSDN的定义:

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

从定义可以看出,对现有类型进行扩展,需新建一个静态类,定义静态方法,方法的第一个参数用this指定类型。

下面,我们看一下例子,首先,我定义一个静态类ObjectExtension,然后对所有对象都扩展一个ToNullString方法。如果对象为空,就返回string.Empty

否则,返回obj.ToString ()。

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 ();
}
}
}

那么,我们就可以在像以下那样进行调用:

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哈哈~

C# 3.0 特性之扩展方法的更多相关文章

  1. c#3.0提供的扩展方法

    在c#3.0之前,想要为内置的类型添加一个方法显然是不可能的.但是,c#3.0提供的扩展方法可以解决这个问题.具体代码如下: public static class ExtendedClass {pu ...

  2. C#3.0新特性之扩展方法介绍

    C#3.0扩展方法是给现有类型添加一个方法.现在类型即可是基本数据类型(如int,String等),也可以是自己定义的类.以下是引用片段: //Demo--1 //扩展基本类型 namespace T ...

  3. C#3.0中的扩展方法

    在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...

  4. 第二篇 .NET高级技术之密闭类和静态类及扩展方法

    1.密闭类是修饰为sealed的类, sealed不能有子类.一般只有系统中的一些基本类声明为sealed.面试题:是否可以编写一个类继承自String类? 答:不能,因为string被声明为了sea ...

  5. [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

    前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...

  6. C#学习笔记四: C#3.0自动属性&匿名属性及扩展方法

    前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...

  7. C# Note21: 扩展方法(Extension Method)及其应用

    前言 今天在开会时提到的一个概念,入职3个多月多注重在项目中使用C#的编程知识,一直没有很认真地过一遍C#的全部语法,当我们新人被问及是否了解Extension Method时,一时之间竟不能很通俗准 ...

  8. [译文]c#扩展方法(Extension Method In C#)

    原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...

  9. c#编程指南(五) 扩展方法(Extension Method)

    C# 3.0就引入的新特性,扩展方法可以很大的增加你代码的优美度,扩展方法提供你扩展.NET Framewoke类的扩展途径,书写和规则也简单的要命. 编写扩展方法有下面几个要求: 第一:扩展方法所在 ...

随机推荐

  1. java中匿名类的讲解

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  2. 解决Android上的QPython不能import urllib的问题

    试用了一下QPython,感觉很强大,Kivy也包含进去了,下载一些第三方库也很方便,相对于SL4A来说确实先进了很多. 但是很快发现不能import urllib,提示大概是这样的内容: No mo ...

  3. [AngularJS] ngModelController render function

    ModelValue and ViewValue: $viewValue: Actual string value in the view. $modelValue: The value in the ...

  4. yii中阻止 SHOW CREATE TABLE and SHOW COLUMNS 每次执行

    Disable SHOW CREATE TABLE and SHOW COLUMNS in Yii为啥会显示:SHOW CREATE TABLE and SHOW COLUMNS 答案:This is ...

  5. cocos2dx 背景用小尺寸图片滚动填充的方法

    直接上代码 在初始化方法中添加图片: bool BackGroundLayer::init() { frameCache=CCSpriteFrameCache::sharedSpriteFrameCa ...

  6. Android(java)学习笔记117:英文朗诵android App编写实例

    1.首先,我先把代码放到下面: package com.himi.speaker; import java.util.Locale; import android.app.Activity; impo ...

  7. PHP+ MongoDB

    环境: uname -v # SMP Debian -+deb7u2 php -v PHP -~dotdeb. (cli) (built: Jun ::) Copyright (c) - The PH ...

  8. iOS 获取内存大小使用情况(进度条显示)

    一.获取设备内存大小方法 //返回存储内存占用比例 - (NSString *)getFreeDiskspaceRate{ float totalSpace; .f; NSError *error = ...

  9. Oracle 经典语法(二)

    --提示:工资 = 薪金 + 佣金 1. 找出EMP表中的姓名(ENAME)第三个字母是A 的员工姓名.SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE '__ ...

  10. Wing IDE编译TesorFlow中Mnist convolutional 实例

    # # http://www.cnblogs.com/mydebug/ # from __future__ import absolute_import from __future__ import ...