Reading Properties of an Object with Expression Trees

前端 未结 3 897
太阳男子
太阳男子 2020-12-14 04:40

I want to create a Lambda Expression for every Property of an Object that reads the value dynamically.

What I have so far:

var properties = typeof (T         


        
3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-14 05:08

    After hours of googling found the answer here. I've added the snippets from the blog post as it might help others having the same troubles:

    public static class PropertyInfoExtensions
    {
        public static Func GetValueGetter(this PropertyInfo propertyInfo)
        {
            if (typeof(T) != propertyInfo.DeclaringType)
            {
                throw new ArgumentException();
            }
    
            var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
            var property = Expression.Property(instance, propertyInfo);
            var convert = Expression.TypeAs(property, typeof(object));
            return (Func)Expression.Lambda(convert, instance).Compile();
        }
    
        public static Action GetValueSetter(this PropertyInfo propertyInfo)
        {
            if (typeof(T) != propertyInfo.DeclaringType)
            {
                throw new ArgumentException();
            }
    
            var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
            var argument = Expression.Parameter(typeof(object), "a");
            var setterCall = Expression.Call(
                instance,
                propertyInfo.GetSetMethod(),
                Expression.Convert(argument, propertyInfo.PropertyType));
            return (Action)Expression.Lambda(setterCall, instance, argument).Compile();
        }
    }
    

提交回复
热议问题