如果方法 Condition 返回 true,则执行 IfTrue,否则执行 IfFalse,发生异常则执行 IfError。

通常是这样:

try {
if (Condition()) {
try {
IfTrue();
} catch {
}
} else {
try {
IfFalse();
} catch {
}
}
} catch {
  try {
    IfError();
  } catch {
  }
}

现在可以这样:

public class IfElse {
/// <summary>
/// 预期的 <see cref="Condition"/> 的返回值。
/// </summary>
public bool Expect { private get; set; } = true;
/// <summary>
/// 当 <see cref="IfError"/> 为 null 时,是否使用 <see cref="IfFalse"/> 代替。
/// </summary>
public bool IfFalseAsIfError { private get; set; } = true;
/// <summary>
/// 如果返回 true,则将执行 <see cref="IfTrue"/>,否则执行 <see cref="IfFalse"/>,发生异常则执行 <see cref="IfError"/>。
/// </summary>
public Func<bool> Condition { private get; set; }
/// <summary>
/// 当 <see cref="Condition"/> 返回 true 时。
/// </summary>
public Action IfTrue { private get; set; }
/// <summary>
/// 当 <see cref="Condition"/> 返回 false 时。
/// </summary>
public Action IfFalse { private get; set; }
/// <summary>
/// 当执行 <see cref="Condition"/> 时发生异常时。
/// </summary>
public Action IfError { private get; set; } /// <summary>
/// 每次获取的结果极有可能不一样。
/// </summary>
public bool Assert(IfElseResult result) {
IfElseResult r;
try {
var v = Condition?.Invoke() == Expect;
if (v == true) {
try {
IfTrue?.Invoke();
r = IfElseResult.TC0;
} catch {
r = IfElseResult.TC1;
}
} else {
try {
IfFalse?.Invoke();
r = IfElseResult.FC0;
} catch {
r = IfElseResult.FC1;
}
}
} catch {
try {
if (IfError == null) {
if (IfFalseAsIfError) {
IfFalse?.Invoke();
}
} else {
IfError?.Invoke();
}
r = IfElseResult.E0;
} catch {
r = IfElseResult.E1;
}
}
return (r | result) == r;
}
} /// <summary>
/// <see cref="IfElse"/>的执行状态。
/// </summary>
public enum IfElseResult {
/// <summary>
/// <see cref="IfElse.Condition"/>返回 true。
/// </summary>
C0 = ,
/// <summary>
/// <see cref="IfElse.Condition"/>返回 false。
/// </summary>
C1 = ,
/// <summary>
/// <see cref="IfElse.IfTrue"/>成功执行。
/// </summary>
T0 = ,
/// <summary>
/// <see cref="IfElse.IfTrue"/>发生异常。
/// </summary>
T1 = ,
/// <summary>
/// <see cref="IfElse.IfFalse"/>成功执行。
/// </summary>
F0 = ,
/// <summary>
/// <see cref="IfElse.IfFalse"/>发生异常。
/// </summary>
F1 = ,
/// <summary>
/// <see cref="IfElse.IfError"/>成功执行。
/// </summary>
E0 = ,
/// <summary>
/// <see cref="IfElse.IfError"/>发生异常。
/// </summary>
E1 = ,
TC0 = C0 | T0, TC1 = C0 | T1, FC0 = C1 | F0, FC1 = C1 | F1, E = E0 | E1
}

调用:

new IfElse() {
Expect = true,
Condition = () => true,
IfTrue = () => { },
IfFalse = () => { },
IfError = () => { },
}.Assert(IfElseResult.TC0);

C#是最棒的强类型开发语言,尤其是从6.0开始。但还是更喜欢javascript。

当执行太多不受信任的代码时,除去令人讨厌的大量 trycatch 的办法的更多相关文章

  1. 在Postman中使用不受信任的SSL证书

    阅读目录 第一种方案——临时添加到受信任的证书颁发机构: 第二种方案——永久添加到受信任的证书颁发机构: add by zhj: 在http://www.cnblogs.com/ajianbeyour ...

  2. 在Postman中使用不受信任的SSL证书(转)

    add by zhj: 在http://www.cnblogs.com/ajianbeyourself/p/3898911.html中提到: 对于不受信任的证书,浏览器会发出告警,不过这些也只是告警而 ...

  3. 添加自签发的 SSL 证书为受信任的根证书

    原文:http://cnzhx.net/blog/self-signed-certificate-as-trusted-root-ca-in-windows/ 添加自签发的 SSL 证书为受信任的根证 ...

  4. Chrome:不受信任的证书----openssl签发带Subject Alternative Name的证书

    Chrome下自签名证书提示无效的问题 发现chrome验证证书很严格,必须带有Subject Alternative Name.签发csr时,修改openssl.cnf : vi /etc/ssl/ ...

  5. 出现could not find developer disk image解决办法和不受信任的开发者

    真机测试问题 最近一直遇到这样的问题,很是让人心烦,但是还是要自己解决的,我也是从网上查了很多这样的解决办法,都没有成功,所以今天我要把自己的总结的方法和大家分享一下. iOS测试当中的问题 iOS ...

  6. 发现IE6的一个BUG,添加受信任站点后,页面无法跳转

    最近客户爆了一个问题,说是最近使用我们的系统,一登录浏览器就直接关闭了.   经排查,属于IE6设置受信任站点的问题,受信任站点设置了通配符,如 http://192.168.1.* 这样的格式,而我 ...

  7. nginx https ssl 设置受信任证书[原创]

    1. 安装nginx 支持ssl模块 http://nginx.org/en/docs/configure.html yum -y install openssh openssh-devel (htt ...

  8. 登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用

    登录失败.该登录名来自不受信任的域,不能与 Windows 身份验证一起使用 使用sever sql  远程连接数据库的时候遇到了这个问题,我用的是ADO.NET 实体数据模型,有web.config ...

  9. [转载]浅谈组策略设置IE受信任站点

    在企业中,通常会有一些业务系统,要求必须加入到客户端IE受信任站点,才能完全正常运行访问,在没有域的情况下,可能要通过管理员手动设置,或者通过其它网络推送方法来设置. 有了域之后,这项工作就可以很好的 ...

随机推荐

  1. vs打开项目出现“尚未配置为Web项目XXXX指定的本地IIS URL HTTP://localhost:…… .要打开此项目,需要配置虚拟目录……”提示

    今天打开网上下载的一个源码,出现如标题的这个问题,这是从未遇见的提示.尝试点击是,但是网站还是运行不起来.于是网上搜索,就有了这篇. 解决的方案如下: 注意:也可以用记事本把工程文件(.vcxproj ...

  2. MVC2,MVC3,MVC4和MVC5的不同

    现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Eng ...

  3. solr 4.4添加索引是新手容易遇到的问题

    solr 4.4添加索引是新手容易遇到的问题异常一.Exception in thread "main" java.lang.NoClassDefFoundError: org/a ...

  4. 24章 创建TPL自定义模板(1)

    鼓励分离 促进分工 smarty强大的模板引擎 自己开发可以深入了解模板引擎原理,并且简化(安全性,兼容性和功能不如开源的模板引擎) 流程图

  5. Shell脚本检测Tomcat是否正在运行

    #!/bin/sh # configurations # computer 设备名称 # target 监控目标 # watcher 跟踪者(邮箱) computer="ehetong&qu ...

  6. 【转载】DOS 系统和 Windows 系统有什么关系?为什么windows系统下可以执行dos命令?

    作者:bombless 因为不同的系统都叫 Windows ,这些系统在界面上也有一定连续性并且因此可能造成误解,所以有必要稍微梳理一下几个不同的 Windows 系统.首先是 DOS 上的一个图形界 ...

  7. ASP.NET中cookie与Fiter实现简单登陆,AllowAnonymous匿名登陆

    向服务器发送cookie 在登陆的时候,我们可以可以通过下列代码,向服务器发送cookie,其中包括自己的账号信息(不涉及加密),用以后面判断访问者. HttpCookie cookie = new ...

  8. mysql 存储过程和事件调度

    存储过程(procedure): 建立一个存储过程需要知道的基础知识 1.确定输入/输出的参数和类型: IN tname varchar(20) 其中 IN 表示输入参数,tname  是参数名 va ...

  9. dsp 28377在线升级 实例总结

    使用dsp品台28377d来实现在线升级的功能. 方案 : 升级程序  +  应用程序 升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳 ...

  10. kali4.0 安装32位库

    一.前情提要: OS:Kali4.0 64bit 二.安装32位库: 错误方法:sudo apt-get install lib6-i386 正确方法如下: 1.先以root用户身份登陆: su ro ...