zoukankan      html  css  js  c++  java
  • Expression<Func<T,TResult>>和Func<T,TResult>

    1.Expression<Func<T,TResult>>是表达式

    //使用LambdaExpression构建表达式树
                Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
                Console.WriteLine(expr.Compile()(1, 2, 3));

    https://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression(v=vs.100).aspx

    https://msdn.microsoft.com/zh-cn/library/bb335710(v=vs.100).aspx

    2.Func<T, TResult> 委托

    封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
    public delegate TResult Func<in T, out TResult>(T arg)
    类型参数
    in T
    此委托封装的方法的参数类型。
    该类型参数是逆变的。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
    out TResult
    此委托封装的方法的返回值类型。
    该类型参数是协变的。即可以使用指定的类型或派生程度更高的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
    参数
    arg
    类型:T
    此委托封装的方法的参数。
    返回值
    类型:TResult
    此委托封装的方法的返回值。

      string mid = ",middle part,";
                ///匿名写法
                Func<string, string> anonDel = delegate(string param)
                {
                    param += mid;
                    param += " And this was added to the string.";
                    return param;
                };
                ///λ表达式写法
                Func<string, string> lambda = param =>
                    {
                        param += mid;
                        param += " And this was added to the string.";
                        return param;
                    };
                ///λ表达式写法(整形)
                Func<int, int> lambdaint = paramint =>
                    {
                        paramint = 5;
                        return paramint;
                    };
                ///λ表达式带有两个参数的写法
                Func<int, int, int> twoParams = (x, y) =>
                    {
                      return  x*y;
                    };
                MessageBox.Show("匿名方法:"+anonDel("Start of string"));
                MessageBox.Show("λ表达式写法:" + lambda("Lambda expression"));
                MessageBox.Show("λ表达式写法(整形):" + lambdaint(4).ToString());
                MessageBox.Show("λ表达式带有两个参数:" + twoParams(10, 20).ToString());

     来自:

    http://blog.csdn.net/shuyizhi/article/details/6598013

    3.使用Expression进行查询拼接

        public static class DynamicLinqExpressions
         {
     
             public static Expression<Func<T, bool>> True<T>() { return f => true; }
             public static Expression<Func<T, bool>> False<T>() { return f => false; }
     
             public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                                 Expression<Func<T, bool>> expr2)
             {
                 var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                 return Expression.Lambda<Func<T, bool>>
                       (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
             }
     
             public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                                  Expression<Func<T, bool>> expr2)
             {
                 var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                 return Expression.Lambda<Func<T, bool>>
                       (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
             }
     
         }

    使用方法

           public static IEnumerable<T> FilterBy<T>(this IEnumerable<T> collection, IEnumerable<KeyValuePair<string, string>> query)
             {
                 var filtersCount = int.Parse(query.SingleOrDefault(k => k.Key.Contains("filterscount")).Value);
                 
                 Expression<Func<T, bool>> finalquery = null;
     
                 for (var i = 0; i < filtersCount; i += 1)
                 {
                     var filterValue = query.SingleOrDefault(k => k.Key.Contains("filtervalue" + i)).Value;
                     var filterCondition = query.SingleOrDefault(k => k.Key.Contains("filtercondition" + i)).Value;
                     var filterDataField = query.SingleOrDefault(k => k.Key.Contains("filterdatafield" + i)).Value;
                     var filterOperator = query.SingleOrDefault(k => k.Key.Contains("filteroperator" + i)).Value;
     
                     Expression<Func<T, bool>> current = n => GetQueryCondition(n, filterCondition, filterDataField, filterValue);
     
                     if (finalquery == null)
                     {
                         finalquery = current;
                     }
                     else if (filterOperator == "1")
                     {
                         finalquery = finalquery.Or(current);
                     }
                     else
                     {
                         finalquery = finalquery.And(current);
                     }
                 };
     
                 if (finalquery != null)
                     collection = collection.AsQueryable().Where(finalquery);
     
                 return collection;
             }

    要使用AsQueryable,必须引入 LinqKit.EntityFramework;如果不使用AsQueryable将会报错。

    4.关于SelectListItem的扩展 

    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using System.Web.Mvc;
    using System.Web.UI;
    
    namespace Web.Helper
    {
        public static class SelectListItemExtensions
        {
            /// <summary>
            /// Data.ToSelectListItems(s=>s.Id,s=>s.Name);
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="baseEntities"></param>
            /// <param name="valueExpression"></param>
            /// <param name="textExpression"></param>
            /// <param name="defaultValue"></param>
            /// <returns></returns>
            public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> baseEntities, Expression<Func<T, string>> valueExpression, Expression<Func<T, string>> textExpression, object defaultValue = null)
            {
                dynamic valueNameObject = valueExpression.Body.GetType().GetProperty("Member").GetValue(valueExpression.Body, null);
                dynamic textNameobject = textExpression.Body.GetType().GetProperty("Member").GetValue(textExpression.Body, null);
    
                var valueName = (string)valueNameObject.Name;
                var textName = (string)textNameobject.Name;
    
                return ToSelectListItems(baseEntities, valueName, textName, null);
            }
            /// <summary>
            /// Data.ToSelectListItems("Id", "Name")
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="baseEntities"></param>
            /// <param name="valueName"></param>
            /// <param name="textName"></param>
            /// <param name="defaultValue"></param>
            /// <returns></returns>
            public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> baseEntities, string valueName, string textName, object defaultValue = null)
            {
                if (string.IsNullOrWhiteSpace(valueName) || string.IsNullOrWhiteSpace(textName))
                {
                    return new List<SelectListItem>();
                }
                var selectListItem = new List<SelectListItem>();
                if (defaultValue != null)
                {
                    foreach (var baseEntity in baseEntities)
                    {
                        var itemValue = GetPropertyValue(baseEntity, valueName);
                        selectListItem.Add(new SelectListItem()
                        {
                            Value = itemValue.ToString(),
                            Text = GetPropertyValue(baseEntity, textName).ToString(),
                            Selected = itemValue == defaultValue
                        });
                    }
                }
                else
                {
                    foreach (var baseEntity in baseEntities)
                    {
                        selectListItem.Add(new SelectListItem()
                        {
                            Value = GetPropertyValue(baseEntity, valueName).ToString(),
                            Text = GetPropertyValue(baseEntity, textName).ToString(),
                        });
                    }
                }
    
                return selectListItem;
            }
    
            public static object GetPropertyValue(object obj, string propertyName)
            {
                //反射去获得对象的某个属性值
                //Type t = obj.GetType();
                //PropertyInfo info = t.GetProperty(propertyName);
                //return info.GetValue(obj, null); //设置为SetValue
    
                return DataBinder.GetPropertyValue(obj, propertyName);
                //return DataBinder.Eval(obj, propertyName);
            }
    
    
        }
    }

    原文:http://blog.csdn.net/nabila/article/details/8137169

  • 相关阅读:
    AngularJS双向绑定,手动实施观察
    AngularJS的Hello World
    LESS碎语
    chrome浏览器调试报错:Failed to load resource: the server responsed width a status of 404 (Not Found)…http://127.0.0.1:5099/favicon.ico
    AngularJS报错:[$compile:tpload]
    Javascript中的依赖注入
    使用HTML5和CSS3碎语
    在Brackets中使用Emmet
    使用Brackets
    Bootstrap碎语
  • 原文地址:https://www.cnblogs.com/xcsn/p/4520081.html
Copyright © 2011-2022 走看看