public void SafeFieldPerformanceTests() { int runs = 10000000; object myClass = new MyClassWithPrivateFields(123, new object(), 456, new object()); FieldInfo fieldClassRefValue = IField(myClass.GetType(), "instanceRefValue"); FieldInfo fieldClassVtValue = IField(myClass.GetType(), "instanceVTValue"); StopWatch stopWatch = new StopWatch(); using (stopWatch.Start("Duration Class Set/Get field value: {0}")) { for (int i = 0; i < runs; i++) { SafeField instanceRefField = new SafeField(fieldClassRefValue); SafeField instanceVtField = new SafeField(fieldClassVtValue); int res = (int)instanceVtField.GetValue(myClass); object ores = instanceRefField.GetValue(myClass); } } object myStruct = new MyStructWithPrivateFields(123, new object(), 456, new object()); FieldInfo fieldStructRefValue = IField(myStruct.GetType(), "instanceRefValue"); FieldInfo fieldStructVtValue = IField(myStruct.GetType(), "instanceVTValue"); using (stopWatch.Start("Duration Struct Set/Get field value: {0}")) { for (int i = 0; i < runs; i++) { SafeField instanceRefField = new SafeField(fieldStructRefValue); SafeField instanceVtField = new SafeField(fieldStructVtValue); int res = (int)instanceVtField.GetValue(myStruct); object ores = instanceRefField.GetValue(myStruct); } } /* on my machine prints * * with System.Reflection.Emit.DynamicMethod generated code: * Duration Class Set/Get field value: 00:00:03.2031250 * Duration Struct Set/Get field value: 00:00:03.5625000 * * with standard reflection: * Duration Class Set/Get field value: 00:00:45.4218750 * Duration Struct Set/Get field value: 00:00:44.5312500 * */ }
public void TestInstanceMembersOfStruct() { object testref1 = new object(); object testref2 = new object(); MyStructWithPrivateFields myStruct; // ro readonly int myStruct = new MyStructWithPrivateFields(123, testref1, 456, testref2); SafeField instanceReadonlyVtField = new SafeField(IField(myStruct.GetType(), "instanceReadonlyVTValue")); Assert.AreEqual(123, instanceReadonlyVtField.GetValue(myStruct)); try { instanceReadonlyVtField.SetValue(myStruct, 10); } catch (InvalidOperationException) { } // ro readonly object myStruct = new MyStructWithPrivateFields(123, testref1, 456, testref2); SafeField instanceReadonlyRefField = new SafeField(IField(myStruct.GetType(), "instanceReadonlyRefValue")); Assert.AreSame(testref1, instanceReadonlyRefField.GetValue(myStruct)); try { instanceReadonlyRefField.SetValue(myStruct, this); } catch (InvalidOperationException) { } // ro int myStruct = new MyStructWithPrivateFields(123, testref1, 456, testref2); SafeField instanceVtField = new SafeField(IField(myStruct.GetType(), "instanceVTValue")); Assert.AreEqual(456, instanceVtField.GetValue(myStruct)); try { instanceVtField.SetValue(myStruct, 10); } catch (InvalidOperationException) { } // ro object myStruct = new MyStructWithPrivateFields(123, testref1, 456, testref2); SafeField instanceRefField = new SafeField(IField(myStruct.GetType(), "instanceRefValue")); Assert.AreSame(testref2, instanceRefField.GetValue(myStruct)); try { instanceRefField.SetValue(myStruct, 10); } catch (InvalidOperationException) { } }
public void SafeFieldPerformanceTests() { int runs = 10000000; object myClass = new MyClassWithPrivateFields(123, new object(), 456, new object()); FieldInfo fieldClassRefValue = IField(myClass.GetType(), "instanceRefValue"); FieldInfo fieldClassVtValue = IField(myClass.GetType(), "instanceVTValue"); StopWatch stopWatch = new StopWatch(); using (stopWatch.Start("Duration Class Set/Get field value: {0}")) { for(int i=0;i<runs;i++) { SafeField instanceRefField = new SafeField(fieldClassRefValue); SafeField instanceVtField = new SafeField(fieldClassVtValue); int res = (int) instanceVtField.GetValue( myClass ); object ores = instanceRefField.GetValue( myClass ); } } object myStruct = new MyStructWithPrivateFields(123, new object(), 456, new object()); FieldInfo fieldStructRefValue = IField(myStruct.GetType(), "instanceRefValue"); FieldInfo fieldStructVtValue = IField(myStruct.GetType(), "instanceVTValue"); using (stopWatch.Start("Duration Struct Set/Get field value: {0}")) { for(int i=0;i<runs;i++) { SafeField instanceRefField = new SafeField(fieldStructRefValue); SafeField instanceVtField = new SafeField(fieldStructVtValue); int res = (int) instanceVtField.GetValue( myStruct ); object ores = instanceRefField.GetValue( myStruct ); } } /* on my machine prints with System.Reflection.Emit.DynamicMethod generated code: Duration Class Set/Get field value: 00:00:03.2031250 Duration Struct Set/Get field value: 00:00:03.5625000 with standard reflection: Duration Class Set/Get field value: 00:00:45.4218750 Duration Struct Set/Get field value: 00:00:44.5312500 */ }