public static void RuntimeMethodHandleTest() { MethodInfo mi = typeof(Base).GetMethod(nameof(Base.MyMethod)); RuntimeMethodHandle h = mi.MethodHandle; Assert.Equal(mi, MethodBase.GetMethodFromHandle(h)); Assert.True(h.Value != IntPtr.Zero); Assert.Equal(h.GetHashCode(), h.GetHashCode()); Assert.Equal(default(RuntimeMethodHandle).GetHashCode(), default(RuntimeMethodHandle).GetHashCode()); Assert.True(h.Equals(h)); Assert.False(h.Equals(default(RuntimeMethodHandle))); Assert.False(default(RuntimeMethodHandle).Equals(h)); Assert.True(default(RuntimeMethodHandle).Equals(default(RuntimeMethodHandle))); Assert.True(h.Equals((object)h)); Assert.True(((IEquatable <RuntimeMethodHandle>)h).Equals(h)); Assert.False(h.Equals(new object())); Assert.False(h.Equals(null)); Assert.False(h == default(RuntimeMethodHandle)); Assert.True(h != default(RuntimeMethodHandle)); IntPtr hPtr = RuntimeMethodHandle.ToIntPtr(h); RuntimeMethodHandle hNew = RuntimeMethodHandle.FromIntPtr(hPtr); Assert.True(h.Equals(hNew)); Assert.True(hNew.Equals(h)); // Confirm the created handle is valid Assert.Equal(mi, MethodBase.GetMethodFromHandle(hNew)); }