How do I set a field value in an C# Expression tree?

后端 未结 6 623
野趣味
野趣味 2020-12-02 08:16

Given:

FieldInfo field = ;
ParameterExpression targetExp = Expression.Parameter(typeof(T), \"target\");
ParameterExp         


        
6条回答
  •  感情败类
    2020-12-02 09:12

    I once made this class. Perhaps it helps:

    public class GetterSetter
    {
        private readonly Func getter;
        private readonly Action setter;
        private readonly string propertyName;
        private readonly Expression> propertyNameExpression;
    
        public EntityType Entity { get; set; }
    
        public GetterSetter(EntityType entity, Expression> property_NameExpression)
        {
            Entity = entity;
            propertyName = GetPropertyName(property_NameExpression);
            propertyNameExpression = property_NameExpression;
            //Create Getter
            getter = propertyNameExpression.Compile();
            // Create Setter()
            MethodInfo method = typeof (EntityType).GetProperty(propertyName).GetSetMethod();
            setter = (Action)
                     Delegate.CreateDelegate(typeof(Action), method);
        }
    
    
        public propType Value
        {
            get
            {
                return getter(Entity);
            }
            set
            {
                setter(Entity, value);
            }
        }
    
        protected string GetPropertyName(LambdaExpression _propertyNameExpression)
        {
            var lambda = _propertyNameExpression as LambdaExpression;
            MemberExpression memberExpression;
            if (lambda.Body is UnaryExpression)
            {
                var unaryExpression = lambda.Body as UnaryExpression;
                memberExpression = unaryExpression.Operand as MemberExpression;
            }
            else
            {
                memberExpression = lambda.Body as MemberExpression;
            }
            var propertyInfo = memberExpression.Member as PropertyInfo;
            return propertyInfo.Name;
        }
    

    test:

    var gs = new GetterSetter(new OnOffElement(), item => item.IsOn);
            gs.Value = true;
            var result = gs.Value;
    

提交回复
热议问题