예제 #1
0
        public void Should_be_able_to_access_a_private_setter()
        {
            PrivateSetter instance = new PrivateSetter();

            var property = instance.GetType()
                .GetProperties(BindingFlags.Instance|BindingFlags.Public)
                .Where(x => x.Name == "Name")
                .First();

            var fastProperty = new FastProperty<PrivateSetter>(property, BindingFlags.NonPublic);

            const string expectedValue = "Chris";
            fastProperty.Set(instance, expectedValue);

            Assert.AreEqual(expectedValue, fastProperty.Get(instance));
        }
예제 #2
0
        protected override Expression VisitMemberAccess(MemberExpression m)
        {
            var property = m.Member as PropertyInfo;

            if (property == null)
            {
                throw new ArgumentException("Unable to make access for non-property: " + m);
            }

            Action <object, object> setMethod = FastProperty.GetSetMethod(property, true);

            if (_setter == null)
            {
                _type   = property.PropertyType;
                _setter = (o, args, v) => { setMethod(o, v); };
            }
            else
            {
                Func <object, object>        getMethod     = FastProperty.GetGetMethod(property);
                Func <object>                factoryMethod = CreateFactory(property.PropertyType);
                Action <object, int, object> nextSetter    = _setter;

                _setter = (o, args, v) =>
                {
                    object target = getMethod(o);
                    if (target == null)
                    {
                        target = factoryMethod();
                        setMethod(o, target);
                    }

                    nextSetter(target, args, v);
                };
            }

            return(base.VisitMemberAccess(m));
        }
 public FastPropertyGetPropertyRunner()
 {
     _valueProperty = new FastProperty<MyClass, int>(x => x.Value);
     _textProperty = new FastProperty<MyClass, string>(x => x.Text);
 }
예제 #4
0
        protected override Expression VisitMemberAccess(MemberExpression m)
        {
            var property = m.Member as PropertyInfo;
            if (property == null)
                throw new ArgumentException("Unable to make access for non-property: " + m);

            Action<object, object> setMethod = new FastProperty(property, BindingFlags.NonPublic).SetDelegate;

            if (_setter == null)
            {
                _type = property.PropertyType;
                _setter = (o, args, v) => { setMethod(o, v); };
            }
            else
            {
                Func<object, object> getMethod = new FastProperty(property, BindingFlags.NonPublic).GetDelegate;
                Func<object> factoryMethod = CreateFactory(property.PropertyType);
                Action<object, int, object> nextSetter = _setter;

                _setter = (o, args, v) =>
                    {
                        object target = getMethod(o);
                        if (target == null)
                        {
                            target = factoryMethod();
                            setMethod(o, target);
                        }

                        nextSetter(target, args, v);
                    };
            }

            return base.VisitMemberAccess(m);
        }
 public FastPropertyObjectGetPropertyRunner()
 {
     _valueProperty = new FastProperty<MyClass>(x => x.Value);
     _textProperty = new FastProperty<MyClass>(x => x.Text);
 }