コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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);
            }
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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);
            }
        }