C#ASP.NET 通用扩展函数之 LogicSugar 简单好用

说明一下性能方面 还可以接受 循环1000次普通Switch是用了0.001秒 ,扩展函数为0.002秒  , 如果是大项目在有负载均衡的情况下完全可以无视掉,小项目也不会计较这点性能了。

注意需要引用 “SyntacticSugar”

用法:

            //【Switch】
            string bookKey = "c#";

            //以前写法
            string myBook = "";
            switch (bookKey)
            {
                case "c#":
                    myBook = "asp.net技术";
                    break;
                case "java":
                    myBook = "java技术";
                    break;
                case "sql":
                    myBook = "mssql技术";
                    break;
                default:
                    myBook = "要饭技术";
                    break;//打这么多break和封号,手痛吗?
            }

            //现在写法
            myBook =bookKey.Switch().Case("c#", "asp.net技术").Case("java", "java技术").Case("sql", "sql技术").Default("要饭技术").Break();//点的爽啊

            /**
                  C#类里看不出效果,  在mvc razor里   ? 、&& 或者 || 直接使用都会报错,需要外面加一个括号,嵌套多了很不美观,使用自定义扩展函数就没有这种问题了。

             */

            bool isSuccess = true;

            //【IIF】
            //以前写法
            var trueVal1 = isSuccess ? 100 :0;
            //现在写法
            var trueVal2 = isSuccess.IIF(100);

            //以前写法
            var str = isSuccess ? "我是true" : "";
            //现在写法
            var str2 = isSuccess.IIF("我是true");

            //以前写法
            var trueVal3 = isSuccess ? 1 : 2;
            //现在写法
            var trueVal4 = isSuccess.IIF(1, 2);

            string id = "";
            string id2 = "";

            //以前写法
            isSuccess = (id == id2) && (id != null && Convert.ToInt32(id) > 0);
            //现在写法
            isSuccess = (id == id2).And(id != null, Convert.ToInt32(id) > 0);

            //以前写法
            isSuccess = id != null || id != id2;
            //现在写法
            isSuccess = (id != null).Or(id != id2);

  

源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SyntacticSugar
{
    /// <summary>
    /// ** 描述:逻辑糖来简化你的代码
    /// ** 创始时间:2015-6-1
    /// ** 修改时间:-
    /// ** 作者:sunkaixuan
    /// ** 使用说明:http://www.cnblogs.com/sunkaixuan/p/4545338.html
    /// </summary>
    public static class LogicSugarExtenions
    {
        /// <summary>
        /// 根据表达式的值,来返回两部分中的其中一个。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="thisValue"></param>
        /// <param name="trueValue">值为true返回 trueValue</param>
        /// <param name="falseValue">值为false返回 falseValue</param>
        /// <returns></returns>
        public static T IIF<T>(this bool thisValue, T trueValue, T falseValue)
        {
            if (thisValue)
            {
                return trueValue;
            }
            else
            {
                return falseValue;
            }
        }

        /// <summary>
        /// 根据表达式的值,true返回trueValue,false返回string.Empty;
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="thisValue"></param>
        /// <param name="trueValue">值为true返回 trueValue</param>
        /// <returns></returns>
        public static string IIF(this bool thisValue, string trueValue)
        {
            if (thisValue)
            {
                return trueValue;
            }
            else
            {
                return string.Empty;
            }
        }

        /// <summary>
        /// 根据表达式的值,true返回trueValue,false返回0
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="thisValue"></param>
        /// <param name="trueValue">值为true返回 trueValue</param>
        /// <returns></returns>
        public static int IIF(this bool thisValue, int trueValue)
        {
            if (thisValue)
            {
                return trueValue;
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// 根据表达式的值,来返回两部分中的其中一个。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="thisValue"></param>
        /// <param name="trueValue">值为true返回 trueValue</param>
        /// <param name="falseValue">值为false返回 falseValue</param>
        /// <returns></returns>
        public static T IIF<T>(this bool? thisValue, T trueValue, T falseValue)
        {
            if (thisValue == true)
            {
                return trueValue;
            }
            else
            {
                return falseValue;
            }
        }

        /// <summary>
        /// 所有值为true,则返回true否则返回false
        /// </summary>
        /// <param name="thisValue"></param>
        /// <param name="andValues"></param>
        /// <returns></returns>
        public static bool And(this bool thisValue, params bool[] andValues)
        {
            return thisValue && !andValues.Where(c => c == false).Any();
        }

        /// <summary>
        /// 只要有一个值为true,则返回true否则返回false
        /// </summary>
        /// <param name="thisValue"></param>
        /// <param name="andValues"></param>
        /// <returns></returns>
        public static bool Or(this bool thisValue, params bool[] andValues)
        {
            return thisValue || andValues.Where(c => c == true).Any();
        }

        /// <summary>
        /// Switch().Case().Default().Break()
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="thisValue"></param>
        /// <returns></returns>
        public static SwitchSugarModel<T> Switch<T>(this T thisValue)
        {
            var reval = new SwitchSugarModel<T>();
            reval.SourceValue = thisValue;
            return reval;

        }

        public static SwitchSugarModel<T> Case<T, TReturn>(this SwitchSugarModel<T> switchSugar, T caseValue, TReturn returnValue)
        {
            if (switchSugar.SourceValue.Equals(caseValue))
            {
                switchSugar.IsEquals = true;
                switchSugar.ReturnVal = returnValue;
            }
            return switchSugar;
        }

        public static SwitchSugarModel<T> Default<T, TReturn>(this SwitchSugarModel<T> switchSugar, TReturn returnValue)
        {
            if (switchSugar.IsEquals == false)
                switchSugar.ReturnVal = returnValue;
            return switchSugar;
        }

        public static dynamic Break<T>(this SwitchSugarModel<T> switchSugar)
        {
            string reval = switchSugar.ReturnVal;
            switchSugar = null;//清空对象,节约性能
            return reval;
        }

        public class SwitchSugarModel<T>
        {
            public T SourceValue { get; set; }
            public bool IsEquals { get; set; }
            public dynamic ReturnVal { get; set; }
        }

    }

}

  

时间: 2024-11-07 20:21:28

C#ASP.NET 通用扩展函数之 LogicSugar 简单好用的相关文章

ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了

用法: var int1 = "2".TryToInt();//转换为int失败返回0 var int2 = "2x".TryToInt(); var int3 = "2".TryToInt(1);//转换为int失败返回1 var int4 = "2x".TryToInt(1); var d1 = "2".TryToMoney(); //同上 var d2 = "2x".TryToMo

ASP.NET通用权限组件实现一

沙发(SF)通用权限验证组件 开篇 上一篇提到了通用权限的设计思路,根据设计思路一步一步的来实现一个相对通用的权限验证组件.在VS2010下用C#语言基于.net framework2.0框架实现具体功能. 配置文件 配置文件为XML格式(SFPermission.xml)公有四个节点分类: 一.AppSet节点:此节点配置一些基础信息. 1 <AppSet> 2 <!--数据库节点名称(必须在Web.config的connectionStrings节点下面)--> 3 <a

ASP.NET通用权限组件思路设计

开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到控制权限的目的,这样就可以减少通常要在每个页面或按钮都要添加的权限验证代码. 通常的权限验证模式 一般的权限验证会控制到菜单(页面)就可以满足,复杂一点的会要求控制到按钮(功能点),这个都需要做一下几点工作: 1.按权限生成菜单,这是所有系统都要做的: 2.在每个页面的开始处添加登录和权限的验证,调

Asp.Net 控件radio 的简单使用

js: <script type="text/javascript"> function ok() { document.getElementById("txtPassword").disabled = false; } function no() { document.getElementById("txtPassword").disabled = true; } </script> 添加radio控件: <lab

ASP.NET中登录功能的简单逻辑设计

 ASP.NET中登录功能的简单逻辑设计                               概述                               逻辑设计                               1.接收参数                               2.判断参数合法性                               3.访问数据库                               4.保存Session     

ASP.NET通用权限验证组件实现

沙发(SF)通用权限验证组件 开篇 本篇介绍通用权限验证的实现代码思路,总共分为导入参数.解析XML.根据XML配置进行处理.返回结果. 代码架构图 1.   类介绍 1.SFWebPermission:实现IHttpModule接口,权限验证入口: 2.SFConfig:导入XML配置类: 3.SFPermission:解析XML配置进行权限验证: 4.SFAccessOper:数据库操作类: 5.SFPermissionSQL:XML节点实体类: 6.SFParameter:XML节点实体类

ASP.NET Repeater控件实现简单分页

早上,有看MSDN,看到了 PagedDataSource 类 http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.pageddatasource(v=vs.110).aspx 想起以前Insus.NET只对Gridview和DataList控件进行自定义分页.<GridView和DataList分页组件与用户控件>http://www.cnblogs.com/insus/archive/2009/03/19/14

ASP.net中导出Excel的简单方法介绍

下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat="server" style="width: 700px; margin-left: auto; margin-right: auto;"> <!--startprint--> <table width="100%" border=&

asp.net MVC3 + JQuery 的ajax简单使用

一直都没有使用过JQuery,更没使用过JQuery的ajax支持带来的方便,今天试了一下,真是减少了很多工作量,使用方法也比较简单 这里先记下来,以后使用时可以再拿着用. 本应用中,本来是准备使用长链接的方式,在server端有错误消息产生时,能实时返回错误消息.可在使用长链接时,因为.net功底 不够,以失败告终!所以采用了javascript中间隔查询的方法. 页面代码如下: Java代码   @{ ViewBag.Title = "ErrorMonitor"; } <sc