用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用
一、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的使用的更多相关文章
- java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄
目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...
- .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)
1.自动属性 Auto-Implemented Properties 2.隐式类型 var var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...
- 从扩展方法到匿名方法再到LINQ
1.首先我们应该知道什么是扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法
$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...
- ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53) 今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...
- Javascript中数组方法和方法的扩展
最近一直在努力的恶补javascript中的各种知识,比如说闭包,作用域,继承,构造函数,变量,内置对象等概念.同时,也在学习着ES6的新知识.最近想给大家分享的就是数组实例方法的练习以及如何去扩展一 ...
- 使用扩展方法(this 扩展类型)
namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...
- Easyui扩展或者重载(方法和属性)
1: 使用$.fn.datagrid.defaults.editors重载默认值. 每个编辑器都有以下方法: 名称 属性 描述 init container, options 初始化编辑器并返回目标对 ...
随机推荐
- Fiddler怎样抓取手机的包
Fiddler作为代理服务器,可以拦截到手机发出的请求,再经过Fiddler发送到服务器,获取到服务器响应的数据,这个过程,只要设置配置好了,使用过程不受影响. 要想抓取到手机的包,先要给手机设置一个 ...
- 【sping揭秘】17、@Around,@Introduction
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...
- SQL Server性能优化(15)选择合适的索引
一.关于聚集索引列的选择(参考) 1. 聚集索引所在的列,或者列的组合最好是唯一的. 当我们创建的聚集索引的值不唯一时,SQL Server则无法仅仅通过聚集索引列(也就是关键字)唯一确定一行.此时, ...
- dart之旅(二)- 内建类型
目录 number 类型 字符串 布尔类型 像大多数语言一样,dart 也提供了 number,string,boolean 等类型,包括以下几种: numbers strings booleans ...
- Hadoop项目实战-用户行为分析之应用概述(一)
1.概述 本课程的视频教程地址:<Hadoop 回顾> 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中 ...
- 使用InstallUtil发布windows服务
发布Windows Service的方法 1. 在默认窗口Service1中右键Add Install,自动生成两个类. 2. 修改serviceInstaller1的属性: a)ServiceNa ...
- find 命令参数大全
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- php中 ord() 和 chr() 处理 utf8 字符串
ord() : 将字符转为 ascii 码 (0-256),准确定义官方文档:http://php.net/manual/en/function.ord.php chr() : 将 ascii 码转 ...
- Spring之Bean的作用域与生命周期
在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.B ...
- Django之FBV与CBV
一.FBV与CBV FBV(function based views),即基于函数的视图:CBV(class based views),即基于类的视图,也是基于对象的视图.当看到这个解释时,我是很萌的 ...