首页 > 其他 > 详细

Dynamic Expression.Call Any

时间:2015-11-06 12:54:58      阅读:253      评论:0      收藏:0      [点我收藏+]
public class Foo
    {
        public IList<string> Strings { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //Func<Foo, bool> func =
            //    a => a.Strings.Any(b => b == "asdf");

            // b => b == "asdf";
            var bParameter = Expression.Parameter(typeof(string), "b");
            var asdfConstant = Expression.Constant("asdf");
            var compare = Expression.Equal(bParameter, asdfConstant);
            var compareExpression = Expression.Lambda<Func<string, bool>>(compare, bParameter);
            var ceCompareExpression = Expression.Constant(compareExpression.Compile());

            // a => a.Strings.Any(compareExpression)
            var parameter = Expression.Parameter(typeof(Foo), "foo");

            var foosProperty = Expression.Property(parameter, typeof(Foo).GetProperty("Strings"));
            MethodInfo method = typeof(Enumerable).GetMethods().Where(m => m.Name == "Any" && m.GetParameters().Length == 2).Single().MakeGenericMethod(typeof(string));

            var anyMethod = Expression.Call(method, foosProperty, ceCompareExpression);

            var lambdaExpression = Expression.Lambda<Func<Foo, bool>>(anyMethod, parameter);

            // Test.
            var foo = new Foo { Strings = new List<string> { "asdf", "fdsas" } };

            //Console.WriteLine(string.Format("original func result: {0}", func(foo)));
            Console.Write(string.Format("constructed func result: {0}", lambdaExpression.Compile()(foo)));

            Console.ReadKey();
        }
    }

Dynamic Expression.Call Any

原文:http://www.cnblogs.com/zcm123/p/4942046.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!