public void StaticFieldGetter1WorksWithBoxing() { var field = typeof(Garply).GetField(nameof(Garply.Baz)); var getter = new StaticFieldGetter <IBaz>(field !); getter.Func.Target.Should().BeSameAs(getter); getter.Func.Method.Name.Should().Be(nameof(getter.GetValueReflection)); getter.Func.Method.DeclaringType.Should().Be(typeof(StaticFieldGetter <IBaz>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); IBaz reflectionValue = getter.GetValue(); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(getter); getter.Func.Method.Name.Should().Be(StaticFieldGetter.GetStaticValueOptimized); getter.Func.Method.DeclaringType.Should().NotBe(typeof(StaticFieldGetter <IBaz>)); var optimizedTimer = Stopwatch.StartNew(); IBaz optimizedValue = getter.GetValue(); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void FieldGetter2Works() { var foo = new Foo("abc"); var field = typeof(Foo).GetField(nameof(Foo.Bar)); var getter = new FieldGetter <Foo, string>(field !); getter.Func.Target.Should().BeSameAs(getter); getter.Func.Method.Name.Should().Be(nameof(getter.GetValueReflection)); getter.Func.Method.DeclaringType.Should().Be(typeof(FieldGetter <Foo, string>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); string reflectionValue = getter.GetValue(foo); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(getter); getter.Func.Method.Name.Should().Be(FieldGetter.GetValueOptimized); getter.Func.Method.DeclaringType.Should().NotBe(typeof(FieldGetter <Foo, string>)); var optimizedTimer = Stopwatch.StartNew(); string optimizedValue = getter.GetValue(foo); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void FieldGetter2WorksWithBoxing() { var bar = new Bar { Baz = new Baz(123) }; var field = typeof(Bar).GetField(nameof(Bar.Baz)); var getter = new FieldGetter <Bar, IBaz>(field !); getter.Func.Target.Should().BeSameAs(getter); getter.Func.Method.Name.Should().Be(nameof(getter.GetValueReflection)); getter.Func.Method.DeclaringType.Should().Be(typeof(FieldGetter <Bar, IBaz>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); IBaz reflectionValue = getter.GetValue(bar); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(getter); getter.Func.Method.Name.Should().Be(FieldGetter.GetValueOptimized); getter.Func.Method.DeclaringType.Should().NotBe(typeof(FieldGetter <Bar, IBaz>)); var optimizedTimer = Stopwatch.StartNew(); IBaz optimizedValue = getter.GetValue(bar); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void FieldGetterWorksWithStatic() { var field = typeof(Garply).GetField(nameof(Garply.Bar)); var getter = new FieldGetter(field !); getter.Func.Target.Should().BeSameAs(field); getter.Func.Method.Name.Should().Be(nameof(field.GetValue)); getter.Func.Method.DeclaringType.Should().BeAssignableTo(typeof(FieldInfo)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); object reflectionValue = getter.GetValue(null !); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(field); getter.Func.Method.Name.Should().Be(FieldGetter.GetValueOptimized); getter.Func.Method.DeclaringType.Should().NotBeAssignableTo(typeof(FieldInfo)); var optimizedTimer = Stopwatch.StartNew(); object optimizedValue = getter.GetValue(null !); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void StaticFieldSetter1Works() { Baz.Qux = -1; var field = typeof(Baz).GetField(nameof(Baz.Qux)); var setter = new StaticFieldSetter <int>(field !); setter.Action.Target.Should().BeSameAs(setter); setter.Action.Method.Name.Should().Be(nameof(setter.SetValueReflection)); setter.Action.Method.DeclaringType.Should().Be(typeof(StaticFieldSetter <int>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); setter.SetValue(123); reflectionTimer.Stop(); Baz.Qux.Should().Be(123); setter.SetOptimizedAction(); setter.Action.Target.Should().NotBeSameAs(setter); setter.Action.Method.Name.Should().Be(StaticFieldSetter.SetStaticValueOptimized); setter.Action.Method.DeclaringType.Should().NotBe(typeof(StaticFieldSetter <int>)); var optimizedTimer = Stopwatch.StartNew(); setter.SetValue(456); optimizedTimer.Stop(); Baz.Qux.Should().Be(456); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void FieldSetter2Works() { var foo = new Foo(); var setter = new FieldSetter <Foo, int>(_field); setter.Action.Target.Should().BeSameAs(setter); setter.Action.Method.Name.Should().Be(nameof(setter.SetValueReflection)); setter.Action.Method.DeclaringType.Should().Be(typeof(FieldSetter <Foo, int>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); setter.SetValue(foo, 123); reflectionTimer.Stop(); foo.Bar.Should().Be(123); setter.SetOptimizedAction(); setter.Action.Target.Should().NotBeSameAs(setter); setter.Action.Method.Name.Should().Be(FieldSetter.SetValueOptimized); setter.Action.Method.DeclaringType.Should().NotBe(typeof(FieldSetter <Foo, int>)); var optimizedTimer = Stopwatch.StartNew(); setter.SetValue(foo, 456); optimizedTimer.Stop(); foo.Bar.Should().Be(456); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void FieldSetterWorksWithStatic() { Baz.Qux = -1; var field = typeof(Baz).GetField(nameof(Baz.Qux)); var setter = new FieldSetter(field !); setter.Action.Target.Should().BeSameAs(field); setter.Action.Method.Name.Should().Be(nameof(field.SetValue)); setter.Action.Method.DeclaringType.Should().Be(typeof(FieldInfo)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); setter.SetValue(null !, 123); reflectionTimer.Stop(); Baz.Qux.Should().Be(123); setter.SetOptimizedAction(); setter.Action.Target.Should().NotBeSameAs(field); setter.Action.Method.Name.Should().Be(FieldSetter.SetValueOptimized); setter.Action.Method.DeclaringType.Should().NotBe(typeof(FieldInfo)); var optimizedTimer = Stopwatch.StartNew(); setter.SetValue(null !, 456); optimizedTimer.Stop(); Baz.Qux.Should().Be(456); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void PropertySetter2WorksWithStatic() { Baz.Qux = -1; var property = typeof(Baz).GetProperty(nameof(Baz.Qux)); var setter = new PropertySetter <Foo, int>(property !); setter.Action.Target.Should().BeSameAs(setter); setter.Action.Method.Name.Should().Be(nameof(setter.SetValueReflection)); setter.Action.Method.DeclaringType.Should().Be(typeof(PropertySetter <Foo, int>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); setter.SetValue(null !, 123); reflectionTimer.Stop(); Baz.Qux.Should().Be(123); setter.SetOptimizedAction(); setter.Action.Target.Should().NotBeSameAs(setter); setter.Action.Method.Name.Should().Be(PropertySetter.SetValueOptimized); setter.Action.Method.DeclaringType.Should().NotBe(typeof(PropertySetter <Foo, int>)); var optimizedTimer = Stopwatch.StartNew(); setter.SetValue(null !, 456); optimizedTimer.Stop(); Baz.Qux.Should().Be(456); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void PropertySetterWorks() { var foo = new Foo(); var setter = new PropertySetter(_property); setter.Action.Target.Should().BeSameAs(_property); setter.Action.Method.Name.Should().Be(nameof(_property.SetValue)); setter.Action.Method.DeclaringType.Should().Be(typeof(PropertyInfo)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); setter.SetValue(foo, 123); reflectionTimer.Stop(); foo.Bar.Should().Be(123); setter.SetOptimizedAction(); setter.Action.Target.Should().NotBeSameAs(_property); setter.Action.Method.Name.Should().Be(PropertySetter.SetValueOptimized); setter.Action.Method.DeclaringType.Should().NotBe(typeof(PropertyInfo)); var optimizedTimer = Stopwatch.StartNew(); setter.SetValue(foo, 456); optimizedTimer.Stop(); foo.Bar.Should().Be(456); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void StaticPropertyGetter1Works() { var property = typeof(Garply).GetProperty(nameof(Garply.Bar)); var getter = new StaticPropertyGetter <string>(property !); getter.Func.Target.Should().BeSameAs(getter); getter.Func.Method.Name.Should().Be(nameof(getter.GetValueReflection)); getter.Func.Method.DeclaringType.Should().Be(typeof(StaticPropertyGetter <string>)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); string reflectionValue = getter.GetValue(); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(getter); getter.Func.Method.Name.Should().Be(StaticPropertyGetter.GetStaticValueOptimized); getter.Func.Method.DeclaringType.Should().NotBe(typeof(StaticPropertyGetter <string>)); var optimizedTimer = Stopwatch.StartNew(); string optimizedValue = getter.GetValue(); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }
public void PropertyGetterWorksWithStatic() { var property = typeof(Garply).GetProperty(nameof(Garply.Bar)); var getter = new PropertyGetter(property: property !); getter.Func.Target.Should().BeSameAs(property); getter.Func.Method.Name.Should().Be(nameof(property.GetValue)); getter.Func.Method.DeclaringType.Should().Be(typeof(PropertyInfo)); using (var gc = new GCNoRegion(4194304)) { var reflectionTimer = Stopwatch.StartNew(); object reflectionValue = getter.GetValue(null !); reflectionTimer.Stop(); getter.SetOptimizedFunc(); getter.Func.Target.Should().NotBeSameAs(property); getter.Func.Method.Name.Should().Be(PropertyGetter.GetValueOptimized); getter.Func.Method.DeclaringType.Should().NotBe(typeof(PropertyInfo)); var optimizedTimer = Stopwatch.StartNew(); object optimizedValue = getter.GetValue(null !); optimizedTimer.Stop(); optimizedValue.Should().Be(reflectionValue); optimizedTimer.Elapsed.Should().BeLessThan(reflectionTimer.Elapsed); } }