码迷,mamicode.com
首页 > 其他好文 > 详细

扩展方法使用

时间:2014-07-06 11:01:12      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:扩展

上篇说道扩展方法的简介,这里就说继续上篇说下用法。

扩展方法可以帮助我们向现有类型中添加方法.来符合我们的需要。例如我们可以用扩展方法向string类中添加一个IsValidEmailAddress方法,用于检测是否符合Email标准.


1定义扩展方法

扩展方法规定类必须是静态的.里面包含的所有方法必须都是静态的,(注意:不能定义扩展属性和事件),且第一个参数指定方法作用的类型,this修做前缀.

例如

public static classMyExtensions
    {
        public static int WordCount(this Stringstr)
        {
            return str.Split(new char[] { ' ','.', '?' },
                            StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }  

该方法的参数用this,表示自身修改的为this类型,

 

2使用

扩展方法被定义为静态方法,但是通过实例才能调用,并且参数以this修改为前缀.而且是在编译时绑定的.在使用前首先引入命名空间,然后实例化对象就可以调用了。


3使用实例

String类的方法不少,但是有些用的不是很习惯.这里写了一个字符为空的异常提示类.多用于传递查收的校验

首选定义静态类.在定义静态方法

using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Web;
usingSystem.Diagnostics;
usingSystem.Reflection;
using System.IO;
 
namespace ConfigurationSectionTest1
{
 
public  static class ThrowError
{
////DebuggerNonUserCode.如果设计器提供的类型和成员不是由用户专门创建的代码的一部分,则会增加调试过程的复杂性。 此特性禁止在调试器窗口中显示这些附属类型和成员,并自动逐句通过而不会进入并单步执行设计器提供的代码。 当逐句通过用户代码时,如果调试器遇到此特性,用户将不会看到设计器提供的代码,并且会执行用户提供的下一条代码语句。
 
///<summary>
/// 检查对象是否为空,如果为空,抛出异常
///</summary>
///<typeparam name="T"></typeparam>
///<param name="data"></param>
///<param name="message"></param>
///<param name="messageParams"></param>
[DebuggerNonUserCode]
publicstatic void NullCheck<T>(this object data, string message, paramsobject[] messageParams) where T : System.Exception
  {
    (data== null).TrueThrow<T>(message, messageParams);
  }
 
///<summary>
/// 检查对象是否为空,如果为空,抛出ArgumentNullException
///</summary>
/// <param name="data">被检查的对象</param>
/// <paramname="message">参数的名称</param>
[DebuggerNonUserCode]
publicstatic void NullCheck(this object data, string message)
 {
   NullCheck<ArgumentNullException>(data,message);
 }
 
///<summary>
/// 如果条件表达式boolExpression的结果值为真(true),则抛出strMessage指定的错误信息
///</summary>
/// <paramname="parseExpressionResult">条件表达式</param>
/// <paramname="message">错误信息</param>
/// <paramname="messageParams">错误信息的参数</param>
/// <typeparam name="T">异常的类型</typeparam>
///<remarks>
/// 如果条件表达式boolExpression的结果值为真(true),则抛出message指定的错误信息
[DebuggerNonUserCode]
publicstatic void TrueThrow<T>(this bool parseExpressionResult, string message,params object[] messageParams) where T : System.Exception
 {
   if(parseExpressionResult)
 {
   if(message == null)
   throw new ArgumentNullException("message");
 
   Type exceptionType = typeof(T);
   Objectobj = Activator.CreateInstance(exceptionType); 
   Type[]types = new Type[1];
   types[0]= typeof(string);
 
   ConstructorInfo constructorInfoObj = exceptionType.GetConstructor(
   BindingFlags.Instance| BindingFlags.Public, null,
   CallingConventions.HasThis,types, null);
 
   Object[]args = new Object[1];
 
   args[0]= string.Format(message, messageParams);
 
   constructorInfoObj.Invoke(obj,args);
 
   throw(Exception)obj;
    }
  }
 }
}

对于调用法方,常用在方法参数检测上

Pubilc void test(string Id){
 
Id.NullCheck("字符Id不能为空");
}
图例

 实例化的Id可以直接调用该方法,进行判断,为空,则抛出我们写好的提示。如图

bubuko.com,布布扣

 bubuko.com,布布扣

小结:

以上是对string类型的扩展,当然了其他的类型也是可以扩展的,创造符合自己的需要的方法。由扩展方法联想我们的静态方法,静态方式并不针对某一类型,但是扩展方法却是这对某一类型的扩展,没有继承。这是他们的不同点。


扩展方法使用,布布扣,bubuko.com

扩展方法使用

标签:扩展

原文地址:http://blog.csdn.net/han_yankun2009/article/details/37041273

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!