public static Action <T, TMember> CreateSetter <T, TMember>(this Expression <Func <T, TMember> > expression)
        {
            Debug.Assert(expression.Body is MemberExpression, "Expression is not property or field selector");
            Debug.Assert(((MemberExpression)expression.Body).Member is PropertyInfo || ((MemberExpression)expression.Body).Member is FieldInfo, "Expression is not property or field selector");
            Debug.Assert(Obfuscator.CheckAttribute(((MemberExpression)expression.Body).Member), "Missing obfuscation attribute: [Obfuscation(Feature = Obfuscator.NoRename, Exclude = true)]");

            var member = (MemberExpression)expression.Body;

            if (member.Member is PropertyInfo)
            {
                ParameterExpression paramExpression          = Expression.Parameter(typeof(T));
                ParameterExpression paramExpression2         = Expression.Parameter(typeof(TMember));
                MemberExpression    propertyGetterExpression = Expression.Property(paramExpression, (PropertyInfo)member.Member);
                return(Expression.Lambda <Action <T, TMember> >(Expression.Assign(propertyGetterExpression, paramExpression2), paramExpression, paramExpression2).Compile());
            }
            else
            {
                var info = (FieldInfo)member.Member;
                ParameterExpression objParm    = Expression.Parameter(info.DeclaringType, "obj");
                ParameterExpression valueParm  = Expression.Parameter(info.FieldType, "value");
                MemberExpression    memberExpr = Expression.Field(objParm, info.Name);
                Expression          assignExpr = Expression.Assign(memberExpr, valueParm);
                return(Expression.Lambda <Action <T, TMember> >(assignExpr, objParm, valueParm).Compile());
            }
        }
        public static Func <T, TMember> CreateGetter <T, TMember>(this Expression <Func <T, TMember> > expression)
        {
            Debug.Assert(expression.Body is MemberExpression, "Expression is not property or field selector");
            Debug.Assert(((MemberExpression)expression.Body).Member is PropertyInfo || ((MemberExpression)expression.Body).Member is FieldInfo, "Expression is not property or field selector");
            Debug.Assert(Obfuscator.CheckAttribute(((MemberExpression)expression.Body).Member), "Missing obfuscation attribute: [Obfuscation(Feature = Obfuscator.NoRename, Exclude = true)]");

            var member = (MemberExpression)expression.Body;

            if (member.Member is PropertyInfo)
            {
                ParameterExpression paramExpression          = Expression.Parameter(typeof(T), "value");
                Expression          propertyGetterExpression = Expression.Property(paramExpression, (PropertyInfo)member.Member);
                return(Expression.Lambda <Func <T, TMember> >(propertyGetterExpression, paramExpression).Compile());
            }
            else
            {
                var info = (FieldInfo)member.Member;
                return(info.CreateGetter <T, TMember>());
            }
        }