Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }