今天,我们来聊一聊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. Spring强制使用CGLIB代理事务

    Spring强制使用CGLIB代理事务   springaopjdkreferenceclasspath Spring1.2: 将事务代理工厂[TransactionProxyFactoryBean] ...

  3. 参数对象Struts2中Action的属性接收参数

    题记:写这篇博客要主是加深自己对参数对象的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. Action中三种传递并接受参数: 1.  在Action添加成员属性接受参数 例如请求的 ...

  4. key 限制字符的输入

    //限制字符的输入 { 只能输入以下字符 } procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin  If (Key ...

  5. 利用text插件和css插件优化web应用

    JavaScript的模块化开发到如今,已经相当成熟了,当然,一个应用包含的不仅仅有js,还有html模板和css文件. 那么,如何将html和css也一起打包,来减少没必要的HTTP请求数呢? 本文 ...

  6. cocos2d-x3.2在xcode6.1下的 环境搭建

    由于最近需要给CP开发游戏SDK,顺便又重新接触了下cocos2d-x,自己曾在2011年的时候用过cocos2d-x早起的版本,现发现3.2版于原来的差距还是蛮大的,环境搭建流程如下: 1.xcod ...

  7. Qt focusoutevent 不响应的解决方法

    一般利用focus(焦点)来实现弹窗自动关闭效果. Qt的focus貌似是自己的bug, 经常无法接收到focusout的事件 例如: widgetA 中执行  widgetB->show(); ...

  8. Ubuntu 下安装VNC server

    尽管我们在大部分情况下用ssh登录Ubuntu服务器就好了,但是有时候我们的程序需要在图形界面下运行,这时我们就要用到vnc server这个软件了.在Ubuntu下安装vnc server很简单的, ...

  9. zh-cn,zh-tw,en-us,en-gb等网页语言代码一览表

    zh-cn   简体中文zh-tw   繁体中文da-dk   丹麦语nl-nl   荷兰语en-us   英语fi-fi   芬兰语fr-fr   法语de-de   德语it-it   意大利语j ...

  10. cocos2d-x动作原理

    首先CCAction是所有动作的基类,如下图继承关系: 那么来看看CCAction的定义: class CC_DLL CCAction : public CCObject { public: CCAc ...