如果方法 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. nodejs的初学

    1.启服务器.先server.js,再命令行输入命令node server.js,打开浏览器输入http://127.0.0.1:2016可以看到有内容输出. server.js代码如下: var h ...

  2. apache commons math 示例代码

    apache commons Math是一组偏向科学计算为主的函数,主要是针对线性代数,数学分析,概率和统计等方面. 我虽然是数学专业毕业,当年也是抱着<数学分析>啃,但是好久不用,这些概 ...

  3. selenium测试(Java)--多窗口切换(十三)

    selenium测试(Java)--多窗口切换(十三) 如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过s ...

  4. Android的学习第六章(布局一TableLayout)

    今天我们来简单的说一下Android不居中的TableLayout布局(表格布局) 表格布局的意思就是将我们的布局看做为一个表格,主要用于对控件进行整齐排列 我们看一个简单的案例 <TableL ...

  5. Java 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  6. build/envsetup.sh 生成的命令详解表

    参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...

  7. linux 脚本小试系列

    实现100以内的奇数和和偶数和的脚本 1 #!/bin/bash 2 # #声明一个偶数变量和一个奇数变量 3 declare -i evensum=0 4 declare -i oddsum=0 # ...

  8. 【leetcode❤python】 7. Reverse Integer

    #-*- coding: UTF-8 -*-#2147483648#在32位操作系统中,由于是二进制,#其能最大存储的数据是1111111111111111111111111111111.#正因为此, ...

  9. Linux查看程序端口占用情况

    今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...

  10. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...