LINQ: Passing lambda expression as parameter to be executed and returned by method

前端 未结 3 648
悲&欢浪女
悲&欢浪女 2020-11-28 06:53

So here is the scenario: i have a series of different repository classes that each can use an isolated data context, or a shared context. In the cases where an isolated cont

3条回答
  •  南笙
    南笙 (楼主)
    2020-11-28 07:39

    Here is a complete working sample how to pass LINQ expression as a parameter

    using System;
    using System.Linq.Expressions;
    using System.Reflection;
    
    namespace ConsoleTest
    {
        public class Values
        {
            public int X { get; set; }
            public int Y { get; set; }
    
            public override string ToString()
            {
                return String.Format("[ X={0} Y={1} ]", X, Y);
            }
        }
    
        class Program
        {
            static void Main()
            {
                var values = new Values {X = 1, Y = 1};
    
                // pass parameter to be incremented as linq expression
                IncrementValue(values, v => v.X);
                IncrementValue(values, v => v.X);
                IncrementValue(values, v => v.Y);
    
                // Output is: [ X=3 Y=2 ]
                Console.Write(values);
            }
    
            private static void IncrementValue(T obj, Expression> property)
            {
                var memberExpression = (MemberExpression)property.Body;
                var propertyInfo = (PropertyInfo)memberExpression.Member;
                // read value with reflection
                var value = (int)propertyInfo.GetValue(obj, null);
                // set value with reflection
                propertyInfo.SetValue(obj, ++value, null);
            }
        }
    }
    

提交回复
热议问题