/// <summary> /// Creates dynamic field instance for the specified <see cref="FieldInfo"/>. /// </summary> /// <param name="field">Field info to create dynamic field for.</param> /// <returns>Dynamic field for the specified <see cref="FieldInfo"/>.</returns> public static IDynamicField Create(FieldInfo field) { AssertUtils.ArgumentNotNull(field, "You cannot create a dynamic field for a null value."); IDynamicField dynamicField = new SafeField(field); return(dynamicField); }
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 TestInstanceMembersOfClass() { object testref1 = new object(); object testref2 = new object(); MyClassWithPrivateFields myClass; // ro readonly int myClass = new MyClassWithPrivateFields(123, testref1, 456, testref2); SafeField instanceReadonlyVtField = new SafeField(IField(myClass.GetType(), "instanceReadonlyVTValue")); Assert.AreEqual(123, instanceReadonlyVtField.GetValue(myClass)); try { instanceReadonlyVtField.SetValue(myClass, 10); } catch (InvalidOperationException) { } // ro readonly object myClass = new MyClassWithPrivateFields(123, testref1, 456, testref2); SafeField instanceReadonlyRefField = new SafeField(IField(myClass.GetType(), "instanceReadonlyRefValue")); Assert.AreSame(testref1, instanceReadonlyRefField.GetValue(myClass)); try { instanceReadonlyRefField.SetValue(myClass, this); } catch (InvalidOperationException) { } // rw int myClass = new MyClassWithPrivateFields(123, testref1, 456, testref2); SafeField instanceVtField = new SafeField(IField(myClass.GetType(), "instanceVTValue")); Assert.AreEqual(456, instanceVtField.GetValue(myClass)); instanceVtField.SetValue(myClass, 9182); Assert.AreEqual(9182, instanceVtField.GetValue(myClass)); // rw object myClass = new MyClassWithPrivateFields(123, testref1, 456, testref2); SafeField instanceRefField = new SafeField(IField(myClass.GetType(), "instanceRefValue")); Assert.AreSame(testref2, instanceRefField.GetValue(myClass)); instanceRefField.SetValue(myClass, testref1); Assert.AreSame(testref1, instanceRefField.GetValue(myClass)); }
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) { } }
private void TestStaticMembersOf(Type type, object expectedRoRefValue) { // ro const int SafeField constField = new SafeField(SField(type, "constantValue")); Assert.AreEqual(5, constField.GetValue(null)); try { constField.SetValue(null, 3); } catch (InvalidOperationException) { } // ro static readonly int SafeField roVtField = new SafeField(SField(type, "staticReadonlyVTValue")); Assert.AreEqual(11, roVtField.GetValue(null)); try { roVtField.SetValue(null, 10); } catch (InvalidOperationException) { } // ro static readonly object SafeField roRefField = new SafeField(SField(type, "staticReadonlyRefValue")); Assert.AreSame(expectedRoRefValue, roRefField.GetValue(null)); try { roRefField.SetValue(null, new object()); } catch (InvalidOperationException) { } // rw static int SafeField vtField = new SafeField(SField(type, "staticVTValue")); vtField.SetValue(null, 10); Assert.AreEqual(10, vtField.GetValue(null)); // rw static object SafeField refField = new SafeField(SField(type, "staticRefValue")); object o = new object(); refField.SetValue(null, o); Assert.AreSame(o, refField.GetValue(null)); }