public void FieldAccessorPerformanceTest()
        {
            int loopCount = 100;
            ErrorProneAbstracted instance = new ErrorProneAbstracted();
            System.Reflection.FieldInfo fi = typeof(ErrorProneAbstracted).GetField("Id");
            ShareDeployed.Proxy.FastReflection.FastField ff = new Proxy.FastReflection.FastField(fi);
            ShareDeployed.Proxy.FastReflection.FastField<ErrorProneAbstracted> ff2 = new Proxy.FastReflection.FastField<ErrorProneAbstracted>(fi);
            ShareDeployed.Proxy.FastReflection.FastField<ErrorProneAbstracted, int> ff3 = new Proxy.FastReflection.FastField<ErrorProneAbstracted, int>(fi);
            var dynField = ShareDeployed.Proxy.FastReflection.DynamicField.Create(fi);

            Stopwatch sw = new Stopwatch();
            sw.Start();
            int id = 0;
            for (int i = 1; i <= loopCount; i++)
            {
                fi.SetValue(instance, 12);
                id = (int)fi.GetValue(instance);
            }
            sw.Stop();
            long reflTime = sw.ElapsedMilliseconds;

            sw.Reset();
            sw.Start();
            for (int i = 1; i <= loopCount; i++)
            {
                ff.Set(instance, i);
                id = (int)ff.Get(instance);
            }
            sw.Stop();
            long fastFieldTime = sw.ElapsedMilliseconds;

            sw.Reset();
            sw.Start();
            for (int i = 1; i <= loopCount; i++)
            {
                ff2.Set(instance, i);
                id = (int)ff2.Get(instance);
            }
            sw.Stop();
            long fastFieldTime2 = sw.ElapsedMilliseconds;

            sw.Reset();
            sw.Start();
            for (int i = 1; i <= loopCount; i++)
            {
                ff3.Set(instance, i);
                id = ff3.Get(instance);
            }
            sw.Stop();
            long fastFieldTime3 = sw.ElapsedMilliseconds;

            sw.Reset();
            sw.Start();
            for (int i = 1; i <= loopCount; i++)
            {
                dynField.SetValue(instance, 12);
                id = (int)dynField.GetValue(instance);
            }
            sw.Stop();
            long dynFieldTime = sw.ElapsedMilliseconds;

            Debug.WriteLine(string.Format("Difference is:{0},{1},{2},{3},{4}", reflTime, fastFieldTime, fastFieldTime2, fastFieldTime3, dynFieldTime));
            Assert.IsTrue(fastFieldTime3 < fastFieldTime2 && fastFieldTime2 < fastFieldTime);
            Assert.IsTrue(dynFieldTime < reflTime && fastFieldTime < reflTime);
        }
        public void FastFieldGetSetTest()
        {
            ErrorProneAbstracted objInstance = new ErrorProneAbstracted();
            System.Reflection.FieldInfo fi = objInstance.GetType().GetField("Id");
            Proxy.FastReflection.FastField ff = new Proxy.FastReflection.FastField(fi);
            Proxy.FastReflection.FastField<ErrorProneAbstracted, int> ff3 = new Proxy.FastReflection.FastField<ErrorProneAbstracted, int>(fi);
            var dynField = Proxy.FastReflection.DynamicField.Create(fi);

            int id = -1;
            Stopwatch sw = new Stopwatch();

            sw.Start();
            ff.Set(objInstance, 12);
            id = (int)ff.Get(objInstance);
            sw.Stop();

            long fastElapsed = sw.ElapsedTicks;
            Assert.IsTrue(id == 12);

            sw.Reset();
            sw.Start();
            fi.SetValue(objInstance, 13);
            id = (int)fi.GetValue(objInstance);
            sw.Stop();
            long reflectElapsed = sw.ElapsedTicks;
            Assert.IsTrue(id == 13);

            sw.Reset();
            sw.Start();
            dynField.SetValue(objInstance, 134);
            id = (int)dynField.GetValue(objInstance);
            sw.Stop();
            long dynElapsed = sw.ElapsedTicks;
            Assert.IsTrue(id == 134);

            sw.Reset();
            sw.Start();
            ff3.Set(objInstance, 17);
            id = ff3.Get(objInstance);
            sw.Stop();

            long fastGenElapsed = sw.ElapsedTicks;
            Assert.IsTrue(id == 17);

            Debug.WriteLine("FastField {0},FastField generic {1}, Reflection {2}, DynamicField {3}", fastElapsed, fastGenElapsed, reflectElapsed, dynElapsed);
            Assert.IsTrue(reflectElapsed > fastElapsed);
        }