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>()); } }