private static void SetPropertyByReflection()
        {
            var cache =
                new ReflectionUtils.ThreadSafeDictionary<PropertyInfo, ReflectionUtils.SetDelegate>(
                    ReflectionUtils.GetSetMethodByReflection);

            var obj = new SimpleClass();
            using (new Profiler("prop.set method invoke", _writer))
            {
                var setter = cache[SamplePropertyInfo];
                setter(obj, "val");
            }

            using (new Profiler(_writer))
            {
                var setter = cache[SamplePropertyInfo];
                setter(obj, "val");
            }

            using (new Profiler(_writer))
            {
                for (int i = 0; i < Loops; i++)
                {
                    var setter = cache[SamplePropertyInfo];
                    setter(obj, "val");
                }
            }
        }
        private static void GetFieldByReflection()
        {
            var cache =
                new ReflectionUtils.ThreadSafeDictionary<FieldInfo, ReflectionUtils.GetDelegate>(
                    ReflectionUtils.GetGetMethodByReflection);

            var obj = new SimpleClass();
            using (new Profiler("field.get method invoke", _writer))
            {
                var getter = cache[SampleFieldInfo];
                var value = getter(obj);
            }

            using (new Profiler(_writer))
            {
                var getter = cache[SampleFieldInfo];
                var value = getter(obj);
            }

            using (new Profiler(_writer))
            {
                for (int i = 0; i < Loops; i++)
                {
                    var getter = cache[SampleFieldInfo];
                    var value = getter(obj);
                }
            }
        }
        private static void SetPropertyByExpression()
        {
            #if !REFLECTION_UTILS_NO_LINQ_EXPRESSION
            var cache =
                new ReflectionUtils.ThreadSafeDictionary<PropertyInfo, ReflectionUtils.SetDelegate>(
                    ReflectionUtils.GetSetMethodByExpression);

            var obj = new SimpleClass();
            using (new Profiler("prop.set expression", _writer))
            {
                var setter = cache[SamplePropertyInfo];
                setter(obj, "val");
            }

            using (new Profiler(_writer))
            {
                var setter = cache[SamplePropertyInfo];
                setter(obj, "val");
            }

            using (new Profiler(_writer))
            {
                for (int i = 0; i < Loops; i++)
                {
                    var setter = cache[SamplePropertyInfo];
                    setter(obj, "val");
                }
            }
            #endif
        }
        private static void GetFieldByExpression()
        {
            #if !REFLECTION_UTILS_NO_LINQ_EXPRESSION
            var cache =
                new ReflectionUtils.ThreadSafeDictionary<FieldInfo, ReflectionUtils.GetDelegate>(
                    ReflectionUtils.GetGetMethodByExpression);

            var obj = new SimpleClass();
            using (new Profiler("field.get expression", _writer))
            {
                var getter = cache[SampleFieldInfo];
                var value = getter(obj);
            }

            using (new Profiler(_writer))
            {
                var getter = cache[SampleFieldInfo];
                var value = getter(obj);
            }

            using (new Profiler(_writer))
            {
                for (int i = 0; i < Loops; i++)
                {
                    var getter = cache[SampleFieldInfo];
                    var value = getter(obj);
                }
            }
            #endif
        }