Ejemplo n.º 1
0
        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!"));
        }
Ejemplo n.º 2
0
        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!"));
        }