扩展方法使用

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

扩展方法能够帮助我们向现有类型中加入方法.来符合我们的须要。比如我们能够用扩展方法向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能够直接调用该方法,进行推断,为空,则抛出我们写好的提示。如图

小结:

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

这是他们的不同点。

时间: 2024-10-08 02:01:36

扩展方法使用的相关文章

c# 扩展方法奇思妙用基础篇五:Dictionary&lt;TKey, TValue&gt; 扩展

Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary<TKey, TValue>不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException. 大多时候,我们都会写成以下的样子: var dict = new Dictionary<int, string>()

C#3.0 扩展方法

扩展方法 在很多时候我们需要编写各种各样的帮助类,因为官方提供的再全面,也会有未包含到的地方,这时一个静态的帮助类就可以帮我们解决问题 举一个不是很恰当的例子,假如要对一个字符串进行验证其内容不为null并且等于admin但是很多地方都要调用,按照封装思想要封装成一个方法,看起来可能是下面这样子的 这并没有任何问题,代码也是比较简单,但是很难会有一种亲近感,因为StringiHelper.ValidArg这样的调用存在.比如这个验证应该是官方应该考虑到的,但是他们忽略了,编写这样一个扩展后会有很

C#的扩展方法解析

在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

c# 之DataTable的扩展方法

由于太懒了,很久没更新了.毕业了,得好好装逼学习了,不能一心想着完了. 由于公司中的项目大量的使用DataTable,而每次对datatable进行操作的时候需要写很多相同的代码,所以秉着 装逼而学习 的态度,于是撸了几个扩展方法,记录下来,学习下.     class Program     {         public DataTable LinqTable = new DataTable();         void AddNewRow(int id, string name)   

Entity Framework DbSet&lt;T&gt;之Include方法与IQueryable&lt;T&gt;扩展方法Include的使用

Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑等,下面来看一个例子 例子中有会员实体类(Member)与角色实体类(Role),Role与Member的关系是1:n,控制台应用程序代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst

C#中的扩展方法

在java中没有这样的东西,一个类一旦是 final的 ,这个类就不能再被添加方法, 但是C#能够做到,可以给 sealed 类添加新的方法,这点我还是比较喜欢c#的. 这就是C#中的扩展方法. 那么什么情况下我们才需要去给一个类写扩展方法呢? 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不

ABP框架源码中的Linq扩展方法

文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions.cs using System; using System.Collections.Generic; using System.Linq; namespace Abp.Collections.Extensions { /// <summary> /// Extension methods for

Unity中使用扩展方法解决foreach导致的GC

对于List这种顺序表,我们解决的时候还是可以使用for代替foreach即可.但是对于非顺序表,比如Dictionary或者Set之类,我们可以扩展方法Foreach,ForeachKey和ForeachValue来代替原有的foreach. 关于扩展方法,可参考:https://msdn.microsoft.com/zh-cn/library/bb383977.aspx static class DictionaryEx { /// <summary> /// 提供一个方法遍历所有项 //

C#原始类型扩展方法—this参数修饰符

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩

项目中遇到的扩展方法-总结和分享

概述: 本篇是对工作中遇到的扩展方法的总结,好记性不如乱笔头,先记下来,以后遇到类似问题,如果忘了,可以看下博客. 一.问题描述: 在项目中遇到一个问题,就是要将左边的代码替换为右边的代码,右边代码是对左边代码的封装,所以右边的代码更简便些. dataReader.IsDBNull(2) ? (string)null : dataReader.GetString(2).Trim(); dataReader.MyGetDataString(2); dataReader的类型是System.Data