internal ITrackingConfiguration Property <T, TProperty>(string name, Expression <Func <T, TProperty> > propertyAccessExpression, bool defaultSpecified, TProperty defaultValue) { if (name == null && propertyAccessExpression.Body is MemberExpression me) { // If not specified, use the entire expression as the name of the property. // Note: we don't use just the member name because it might conflict with // another property that uses a different expression but the same member name // e.g. "firstCol.Width" and "secondCol.Width". name = me.ToString(); } var membershipExpression = propertyAccessExpression.Body; var getter = propertyAccessExpression.Compile(); var right = Expression.Parameter(typeof(object)); var propType = membershipExpression.Type; var setter = Expression.Lambda(Expression.Block(Expression.Assign(membershipExpression, Expression.Convert(right, membershipExpression.Type)), Expression.Empty()), propertyAccessExpression.Parameters[0], right).Compile() as Action <T, object>; if (defaultSpecified) { TrackedProperties[name] = new TrackedPropertyInfo(x => getter((T)x), (x, v) => setter((T)x, v), defaultValue); } else { TrackedProperties[name] = new TrackedPropertyInfo(x => getter((T)x), (x, v) => setter((T)x, v)); } return(this); }
internal TrackingConfiguration Property <T, TProperty>(string name, Expression <Func <T, TProperty> > propertyAccessExpression, bool defaultSpecified, TProperty defaultValue) { if (name == null && propertyAccessExpression.Body is MemberExpression me) { name = me.Member.Name; } var membershipExpression = propertyAccessExpression.Body; var getter = propertyAccessExpression.Compile(); var right = Expression.Parameter(typeof(object)); var propType = membershipExpression.Type; var setter = Expression.Lambda(Expression.Block(Expression.Assign(membershipExpression, Expression.Convert(right, membershipExpression.Type)), Expression.Empty()), propertyAccessExpression.Parameters[0], right).Compile() as Action <T, object>; if (defaultSpecified) { TrackedProperties[name] = new TrackedPropertyInfo(x => getter((T)x), (x, v) => setter((T)x, v), defaultValue); } else { TrackedProperties[name] = new TrackedPropertyInfo(x => getter((T)x), (x, v) => setter((T)x, v)); } return(this); }