zoukankan      html  css  js  c++  java
  • 扩展方法使用

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

    扩展方法能够帮助我们向现有类型中加入方法.来符合我们的须要。比如我们能够用扩展方法向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类型的扩展。当然了其它的类型也是能够扩展的,创造符合自己的须要的方法。由扩展方法联想我们的静态方法。静态方式并不针对某一类型。可是扩展方法却是这对某一类型的扩展,没有继承。

    这是他们的不同点。


  • 相关阅读:
    2018年Q1增长最快的20个技能
    微信备份方法
    [转] 浅谈 OpenResty
    Angular默认路由策略-PathLocationStrategy策略页面刷新报404错误解决方案
    [转] ABP框架Web API跨域问题的解决方案
    [转] Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决
    java jdk 8u191 官网下载地址
    IDEA 2019 注册码
    [JAVA] maven 阿里云节点 settings.xml
    .net webapi跨域 web.config配置
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5115640.html
Copyright © 2011-2022 走看看