<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        

      C#進階系列——動態Lamada(二:優化)

      前言:前幾天寫了一篇動態Lamada的文章C#進階系列——動態Lamada,受園友xiao99的啟發,今天打算來重新優化下這個動態Lamada的工具類。在此做個筆記,以免以后忘了。

      一、原理分析

      上篇里面我們說了動態Lamada的使用必要性以及使用場景,但是感覺用在項目里面還不太方便,最難用的就是需要傳遞屬性名稱的字符串,感覺這有點太lower了。然后就是那個枚舉的使用著實感覺沒啥必要,我們只需要將Contains、Equal、LessThan、GreaterThan等方法分別封裝一個獨立的方法即可。好了,多說容易讓人頭暈,直接上代碼吧。

      二、代碼示例

        public class LamadaExtention<Dto> where Dto:new ()
          {
              private List<Expression> m_lstExpression = null;
              private ParameterExpression m_Parameter = null;
      
              public LamadaExtention()
              {
                  m_lstExpression = new List<Expression>();
                  m_Parameter = Expression.Parameter(typeof(Dto), "x");
              }
      
           //只讀屬性,返回生成的Lamada
      public Expression<Func<Dto, bool>> Lamada {
              
      get { return GetLambda(); } } /// <summary> /// 字符串Contains篩選 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void Contains(Expression<Func<Dto, string>> expProperty, object strValue) { Expression expRes = Expression.Call(expProperty.Body, typeof(string).GetMethod("Contains"), Expression.Constant(strValue)); m_lstExpression.Add(expRes); } /// <summary> /// 等于 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void Equal(Expression<Func<Dto, object>> expProperty, object strValue) { var member = GetMemberExpression(expProperty); Expression expRes = Expression.Equal(member, Expression.Constant(strValue, member.Type)); m_lstExpression.Add(expRes); } /// <summary> /// 小于 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void LessThan(Expression<Func<Dto, object>> expProperty, object strValue) { var member = GetMemberExpression(expProperty); Expression expRes = Expression.LessThan(member, Expression.Constant( strValue, member.Type)); m_lstExpression.Add(expRes); } /// <summary> /// 小于等于 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void LessThanOrEqual(Expression<Func<Dto, object>> expProperty, object strValue) { var member = GetMemberExpression(expProperty); Expression expRes = Expression.LessThanOrEqual(member, Expression.Constant(strValue, member.Type)); m_lstExpression.Add(expRes); } /// <summary> /// 大于 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void GreaterThan(Expression<Func<Dto, object>> expProperty, object strValue) { var member = GetMemberExpression(expProperty); Expression expRes = Expression.GreaterThan(member, Expression.Constant(strValue, member.Type)); m_lstExpression.Add(expRes); } /// <summary> /// 大于等于 /// </summary> /// <param name="expProperty"></param> /// <param name="strValue"></param> public void GreaterThanOrEqual(Expression<Func<Dto, object>> expProperty, object strValue) { var member = GetMemberExpression(expProperty); Expression expRes = Expression.GreaterThanOrEqual(member, Expression.Constant(strValue, member.Type)); m_lstExpression.Add(expRes); }private Expression<Func<Dto, bool>> GetLambda() { Expression whereExpr = null; foreach (var expr in this.m_lstExpression) { if (whereExpr == null) whereExpr = expr; else whereExpr = Expression.And(whereExpr, expr); } if (whereExpr == null) return null; return Expression.Lambda<Func<Dto, Boolean>>(whereExpr, m_Parameter); } //得到MemberExpression private MemberExpression GetMemberExpression(Expression<Func<Dto, object>> exp) { var arrSplit = exp.Body.ToString().Split("(.)".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var strProperty = arrSplit[arrSplit.Length - 1]; MemberExpression member = Expression.PropertyOrField(m_Parameter, strProperty); return member; } }

      可以看出,對于常用的操作我們封裝了Contains、Equal、LessThan、LessThanOrEqual、GreaterThan、GreaterThanOrEqual六個方法,除了Contains方法的參數直接使用了Expression<Func<DTO, string>>類型以為,其他都用的Expression<Func<DTO, object>>。因為Contains方法只可能是string類型的變量操作,而其他操作可能涉及其他類型,就是為了傳這個object類型,有個問題博主調試了很久,由于傳過來的是object,這個要得到屬性的真是類型貌似不那么容易了,找了很久都沒找到。最后只能通過GetMemberExpression這個方法來得到MemberExpression。

      還是來看看如何使用:

           public object GetUsers(int limit, int offset, string username, string fullname)
              {
                  var oLamadaExtention = new LamadaExtention<DTO_TR_SYS_USERS>();
                  oLamadaExtention.Equal(x => x.USER_NAME, username);
                  oLamadaExtention.LessThan(x => x.MODIFYTIME, DateTime.Now);
              var lstRes = UserManager.Find(oLamadaExtention.lamada).ToList();
           }

      最大的方便就是我們想要篩選的字段可以通過lamada點出來了,再看看之前的那種用法

      oLamadaExtention.GetExpression("USER_NAME", username, ExpressionType.Contains);

      有沒有瞬間高大上。USER_NAME直接點出來,比敲字符串要爽吧。感謝神奇的Lamada,感謝全能的C#,感謝熱心的園友。

       

      posted @ 2015-11-09 16:35  懶得安分  閱讀(3561)  評論(12)    收藏  舉報
      主站蜘蛛池模板: 福利视频在线一区二区| 亚洲精品国产自在现线最新| 久久国产精品亚洲精品99| 精品超清无码视频在线观看| 无码av最新无码av专区 | а∨天堂一区中文字幕| 亚洲AV高清一区二区三区尤物| 亚洲男女羞羞无遮挡久久丫| 熟女人妻精品一区二区视频| 婷婷综合久久中文字幕| 免费av深夜在线观看| 激情综合五月网| 国语自产拍精品香蕉在线播放| 中国女人熟毛茸茸A毛片| 香港日本三级亚洲三级| 成人无码特黄特黄AV片在线| 中文字幕国产精品自拍| 欧美嫩交一区二区三区| 国产精品福利自产拍久久| 广德县| 亚洲一区二区三区激情在线| 中文字幕av无码免费一区| 亚洲精品美女久久7777777| 成人国产精品日本在线观看| 97在线视频人妻无码| 中国CHINA体内裑精亚洲日本| 色爱无码av综合区| 精品一区二区三区免费视频| 亚洲高清WWW色好看美女| 宜宾市| 国产午夜成人久久无码一区二区| 亚洲精品视频免费| 中文字幕人妻日韩精品| 日韩亚洲精品国产第二页| 国产视色精品亚洲一区二区| 人妻在线中文字幕| 日本中文字幕一区二区三| 18成人片黄网站www| 玩弄放荡人妻少妇系列| 看全色黄大黄大色免费久久| 天美传媒mv免费观看完整|