/// <summary> /// Gets the keys of a weak map using reflection /// </summary> /// <param name="weakMap">The WeakMapInstance</param> /// <returns>Keys</returns> public static IEnumerable <ObjectInstance> GetKeys(this ConditionalWeakTable <ObjectInstance, object> weakMap) { IEnumerable <ObjectInstance> keys = weakMap.GetType().InvokeMember( "Keys", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, weakMap, new object[] { }) as IEnumerable <ObjectInstance>; return(keys); }
public static void Clear_AllValuesRemoved(int numObjects) { var cwt = new ConditionalWeakTable <object, object>(); MethodInfo clear = cwt.GetType().GetMethod("Clear", BindingFlags.NonPublic | BindingFlags.Instance); if (clear == null) { // Couldn't access the Clear method; skip the test. return; } object[] keys = Enumerable.Range(0, numObjects).Select(_ => new object()).ToArray(); object[] values = Enumerable.Range(0, numObjects).Select(_ => new object()).ToArray(); for (int iter = 0; iter < 2; iter++) { // Add the objects for (int i = 0; i < numObjects; i++) { cwt.Add(keys[i], values[i]); Assert.Same(values[i], cwt.GetValue(keys[i], _ => new object())); } // Clear the table clear.Invoke(cwt, null); // Verify the objects are removed for (int i = 0; i < numObjects; i++) { object ignored; Assert.False(cwt.TryGetValue(keys[i], out ignored)); } // Do it a couple of times, to make sure the table is still usable after a clear. } }
public static void Clear_AllValuesRemoved(int numObjects) { var cwt = new ConditionalWeakTable<object, object>(); MethodInfo clear = cwt.GetType().GetMethod("Clear", BindingFlags.NonPublic | BindingFlags.Instance); if (clear == null) { // Couldn't access the Clear method; skip the test. return; } object[] keys = Enumerable.Range(0, numObjects).Select(_ => new object()).ToArray(); object[] values = Enumerable.Range(0, numObjects).Select(_ => new object()).ToArray(); for (int iter = 0; iter < 2; iter++) { // Add the objects for (int i = 0; i < numObjects; i++) { cwt.Add(keys[i], values[i]); Assert.Same(values[i], cwt.GetValue(keys[i], _ => new object())); } // Clear the table clear.Invoke(cwt, null); // Verify the objects are removed for (int i = 0; i < numObjects; i++) { object ignored; Assert.False(cwt.TryGetValue(keys[i], out ignored)); } // Do it a couple of times, to make sure the table is still usable after a clear. } }