一、Linq扩展方法

    1、扩展方法必须是静态方法、扩展方法所在的类必须是静态类

2、扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下:

      二、泛型约束

  1、使用泛型的原因,是在不知道需要扩展的类型时(这里主要时指对象类型,比如:可能时student类型,可能时person类型)前提下使用泛型,但使用泛型时需要加约束

2、泛型约束常用支持以下几个

    where T : struct              T必须是一个结构类型
    where T : class               T必须是一个类(class)类型,不能是结构(struct)类型
    where T : new()               T必须要有一个无参构造函数
    where T : NameOfBaseClass     T必须继承名为NameOfBaseClass的类
    where T : NameOfInterface     T必须实现名为NameOfInterface的接口

3、泛型扩展方法使用如下:

三、扩展方法里面使用lamada表达式处理代码逻辑。这里用到了action委托,action无返回值,参数可有可无,也可以用Func委托(两者区别——>百度),本质都是把委托作为方法的参数传递,类似于方法的回调。

  1、代码如下,T可以是任意类型,但由于方法加了class,new()约束,所以T只能是一个类类型且该类型必须有一个无参构造函数

    

   2、泛型扩展方法的使用

      Student.IsNull(o=>{

        o.Id="1001"

        o.Name="张嘞个三"

      })

四、扩展方法demo,整个源码,可以直接用,需要扩展其他类型,往里面追加

  //扩展方法所在的类必须是静态类

  public static class ExtendMethod

  {
    public static bool IsNotEmpty(this string obj, Action action)
    {
      bool result = string.IsNullOrEmpty(obj);
      if (!result)
      {
        action();
      }
      return result;
    }
    public static bool IsNotEmpty(this string obj, Action<string> action)
    {
      bool result = string.IsNullOrEmpty(obj);
      if (!result)
      {
        action(obj);
      }
      return result;
    }
    public static bool IsEmpty(this string obj, Action action)
    {
      bool result = string.IsNullOrEmpty(obj);
      if (result)
      {
        action();
      }
      return result;
    }

    public static bool IsEmpty(this string obj, Action<string> action)
    {
      bool result = string.IsNullOrEmpty(obj);
      if (result)
      {
        action(obj);
      }
      return result;
    }

    public static bool IsNotNull<T>(this T t, Action action)
      where T : class, new()
    {
      bool result = t == null;
      if (!result)
      {
        action();
      }
      return result;
    }

    public static bool IsNotNull<T>(this T t, Action<T> action)
      where T : class , new()
    {
      bool result = t == null;
      if (!result)
      {
        action(t);
      }
      return result;
    }

    public static bool IsNull<T>(this T t, Action action)
      where T : class ,new()
    {
      bool result = t == null;
      if (result)
      {
        action();
      }
      return result;
    }

    public static bool IsNull<T>(this T t, Action<T> action)
      where T : class ,new()
    {
      bool result = t == null;
      if (result)
      {
        action(t);
      }
      return result;
    }

  }

五、以上demo示列的用法如下:

 1、扩展string类型判断字符是否为空

 string m = string.Empty;

  m.IsNotEmpty(() =>
  {
    m = "1";
  });

  m.IsNotEmpty(o =>
  {
    m = f;
  });

 2、泛型扩展类型,判断对象是否为null
  Student stu=new Student();

  //这里括号指匿名方法,可以理解成占位符

  stu.IsNull(() => {

    stu.Id="1003";

    stu.Name="李四";

   });
  

  stu.IsNull(o => {

    

    o.Id="1003";

    o.Name="李四";

   });

  
  stu.IsNotNull(() => {

    stu.Id="1003";

    stu.Name="李四";

  });

  stu.IsNotNull(o => {

    o.Id="1003";

    o.Name="李四";

  });

    

用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用的更多相关文章

  1. java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄

    目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...

  2. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  3. 从扩展方法到匿名方法再到LINQ

    1.首先我们应该知道什么是扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  4. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  5. jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法

    $.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...

  6. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

  7. Javascript中数组方法和方法的扩展

    最近一直在努力的恶补javascript中的各种知识,比如说闭包,作用域,继承,构造函数,变量,内置对象等概念.同时,也在学习着ES6的新知识.最近想给大家分享的就是数组实例方法的练习以及如何去扩展一 ...

  8. 使用扩展方法(this 扩展类型)

    namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...

  9. Easyui扩展或者重载(方法和属性)

    1: 使用$.fn.datagrid.defaults.editors重载默认值. 每个编辑器都有以下方法: 名称 属性 描述 init container, options 初始化编辑器并返回目标对 ...

随机推荐

  1. EF code first,set composite primary key 复合key问题

    环境: EF core 2.0 Net core 2.0 错误: 因实体定义了多个key,打开数据库时程序报以下错误 An unhandled exception occurred while pro ...

  2. AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录

    参考链接:http://www.wangchao.info/1137.html  注意:链接中写的简化了,其中重启服务的命令似乎不太适用,可能是不通用,我下面描述的方式亲测可行,如有其他疑问请留言: ...

  3. 全网最详细的IDEA里如何正确新建普通的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(类似eclipse里同一个workspace下【一个子项目】并存)(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 如果是在Myeclipse里,则是File -> new -> ...

  4. [Luogu1365] WJMZBMR打osu! / Easy

    Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 \(n\) 次点击要做,成功了就是o,失败了就是x,分数是按com ...

  5. Ocelot中文文档-Not Supported

    Not Supported Ocelot不支持以下几种情况 块级编码(Chunked Encoding ) - Ocelot始终会获取消息体的大小并返回内容长度(Content-Length).这种情 ...

  6. 近乎产品MVC架构介绍-多租户模式

    应用的数据部分支持多租户,租户可以是呈现区域(PersentArea)也可以是另一个应用.在数据库设计方面采用最简单的方式,在应用数据表中增加TenantTypeId(存储对应的Application ...

  7. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  8. 【Spring】12、Spring Security 四种使用方式

    spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...

  9. 【Java面试】1、基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充. 源码分享:https: ...

  10. js事件冒泡和事件捕获详解

    Javascript与HTML之间的交互是通过事件实现. 一.事件流 事件,是文档或浏览器窗口中发生的一些特定的交互瞬间.事件流,描述的是页面中接受事件的顺序.IE9,chrome,Firefox,O ...