你的位置:首页 > ASP.net教程

[ASP.net教程]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; }    }  }}