public void CreateFullNamedMethodOverride_ProtectedMethod() { var classEmitter = new CustomClassEmitter(Scope, "CreateFullNamedMethodOverride_ProtectedMethod", typeof(ClassWithProtectedVirtualMethod), new[] { typeof(IMarkerInterface) }, TypeAttributes.Public | TypeAttributes.Class, false); var toStringMethod = classEmitter.CreateFullNamedMethodOverride(typeof(ClassWithProtectedVirtualMethod).GetMethod( "GetSecret", BindingFlags.NonPublic | BindingFlags.Instance)); toStringMethod.AddStatement(new ReturnStatement(new ConstReference("P0wned!"))); Type builtType = classEmitter.BuildType(); MethodInfo method = builtType.GetMethod("GetSecret", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); Assert.That(method, Is.Null); method = builtType.GetMethod(typeof(ClassWithProtectedVirtualMethod).FullName + ".GetSecret", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); Assert.That(method, Is.Not.Null); Assert.That(method.IsFamily, Is.True); Assert.That(method.IsVirtual, Is.True); Assert.That(method.IsFinal, Is.True); var instance = (ClassWithProtectedVirtualMethod)Activator.CreateInstance(builtType); Assert.That(method.Invoke(instance, null), Is.EqualTo("P0wned!")); }
public void CreateFullNamedMethodOverride() { var classEmitter = new CustomClassEmitter(Scope, "CreateFullNamedMethodOverride", typeof(object), new[] { typeof(IMarkerInterface) }, TypeAttributes.Public | TypeAttributes.Class, false); var toStringMethod = classEmitter.CreateFullNamedMethodOverride(typeof(object).GetMethod("ToString")); toStringMethod.AddStatement(new ReturnStatement(new ConstReference("P0wned!"))); Type builtType = classEmitter.BuildType(); MethodInfo method = builtType.GetMethod("ToString", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); Assert.That(method, Is.Null); method = builtType.GetMethod("System.Object.ToString", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); Assert.That(method, Is.Not.Null); Assert.That(method.IsPublic, Is.True); Assert.That(method.IsVirtual, Is.True); Assert.That(method.IsFinal, Is.True); object instance = Activator.CreateInstance(builtType); Assert.That(instance.ToString(), Is.EqualTo("P0wned!")); }