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