Ejemplo n.º 1
0
        public void AddForwardingExplicitInterfaceMethod(MethodInfo methodInfo)
        {
            ArgumentUtility.CheckNotNull("methodInfo", methodInfo);
            var methodEmitter = _classEmitter.CreateInterfaceMethodImplementation(methodInfo);

            //methodEmitter.ImplementByDelegating (new TypeReferenceWrapper (_proxied, methodInfo.DeclaringType), methodInfo);
            ImplementForwardingMethod(methodInfo, methodEmitter);
        }
Ejemplo n.º 2
0
        public void EventNameIsNotChangedOnPublicInterfaceImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "EventNameIsNotChangedOnPublicInterfaceImplementation", typeof(object), new[] { typeof(IInterfaceWithEvent) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            CustomEventEmitter eventEmitter = classEmitter.CreatePublicInterfaceEventImplementation(
                typeof(IInterfaceWithEvent).GetEvent("Event", _declaredInstanceBindingFlags));

            eventEmitter.AddMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithEvent).GetMethod("add_Event", _declaredInstanceBindingFlags));
            eventEmitter.AddMethod.AddStatement(new ReturnStatement());

            eventEmitter.RemoveMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithEvent).GetMethod("remove_Event", _declaredInstanceBindingFlags));
            eventEmitter.RemoveMethod.AddStatement(new ReturnStatement());

            Type builtType = classEmitter.BuildType();

            Assert.That(builtType.GetEvent("Event", _declaredInstanceBindingFlags), Is.Not.Null);
        }
Ejemplo n.º 3
0
        public void CreateInterfaceMethodImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "CreateInterfaceMethodImplementation", typeof(object), new[] { typeof(ICloneable) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            var cloneMethod = classEmitter.CreateInterfaceMethodImplementation(typeof(ICloneable).GetMethod("Clone"));

            cloneMethod.AddStatement(new ReturnStatement(new ConstReference("P0wned!")));

            Type   builtType = classEmitter.BuildType();
            object instance  = Activator.CreateInstance(builtType);

            Assert.That(((ICloneable)instance).Clone(), Is.EqualTo("P0wned!"));
        }
        public void ImplementingSimpleMembersOfOpenGenericInterface()
        {
            CustomClassEmitter classEmitter =
                new CustomClassEmitter(
                    Scope,
                    "ImplementingSimpleMembersOfOpenGenericInterface",
                    typeof(object),
                    new Type[] { typeof(GenericInterfaceWithAllKindsOfMembers <int>) },
                    TypeAttributes.Public | TypeAttributes.Class, false);

            MethodInfo baseMethod       = typeof(GenericInterfaceWithAllKindsOfMembers <int>).GetMethod("Method");
            var        overriddenMethod = classEmitter.CreateInterfaceMethodImplementation(baseMethod);

            overriddenMethod.AddStatement(new ReturnStatement());

            PropertyInfo          baseProperty       = typeof(GenericInterfaceWithAllKindsOfMembers <int>).GetProperty("Property");
            CustomPropertyEmitter overriddenProperty = classEmitter.CreateInterfacePropertyImplementation(baseProperty);

            overriddenProperty.GetMethod = classEmitter.CreateInterfaceMethodImplementation(baseProperty.GetGetMethod());
            overriddenProperty.GetMethod.AddStatement(new ReturnStatement(new ConstReference(13)));

            EventInfo          baseEvent       = typeof(GenericInterfaceWithAllKindsOfMembers <int>).GetEvent("Event");
            CustomEventEmitter overriddenEvent = classEmitter.CreateInterfaceEventImplementation(baseEvent);

            overriddenEvent.AddMethod = classEmitter.CreateInterfaceMethodImplementation(baseEvent.GetAddMethod());
            overriddenEvent.AddMethod.AddStatement(new ReturnStatement());
            overriddenEvent.RemoveMethod = classEmitter.CreateInterfaceMethodImplementation(baseEvent.GetRemoveMethod());
            overriddenEvent.RemoveMethod.AddStatement(new ReturnStatement());

            Type builtType = classEmitter.BuildType();
            GenericInterfaceWithAllKindsOfMembers <int> instance = (GenericInterfaceWithAllKindsOfMembers <int>)Activator.CreateInstance(builtType);

            instance.Method(7);
            Assert.That(instance.Property, Is.EqualTo(13));
            instance.Event += delegate { return(0); };
            instance.Event -= delegate { return(0); };
        }
Ejemplo n.º 5
0
        public void CreatePublicInterfaceEventImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "CreatePublicInterfaceEventImplementation", typeof(object), new[] { typeof(IInterfaceWithEvent) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            CustomEventEmitter eventEmitter = classEmitter.CreatePublicInterfaceEventImplementation(
                typeof(IInterfaceWithEvent).GetEvent("Event", _declaredInstanceBindingFlags));

            eventEmitter.AddMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithEvent).GetMethod("add_Event", _declaredInstanceBindingFlags));
            eventEmitter.AddMethod.AddStatement(new ReturnStatement());

            eventEmitter.RemoveMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithEvent).GetMethod("remove_Event", _declaredInstanceBindingFlags));
            eventEmitter.RemoveMethod.AddStatement(new ReturnStatement());

            Type builtType = classEmitter.BuildType();

            var          instance     = (IInterfaceWithEvent)Activator.CreateInstance(builtType);
            EventHandler eventHandler = delegate { };

            instance.Event += eventHandler;
            instance.Event -= eventHandler;
        }
Ejemplo n.º 6
0
        public void PropertyNameIsNotChangedOnPublicInterfaceImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "PropertyNameIsNotChangedOnPublicInterfaceImplementation", typeof(object), new[] { typeof(IInterfaceWithProperty) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            CustomPropertyEmitter property = classEmitter.CreatePublicInterfacePropertyImplementation(
                typeof(IInterfaceWithProperty).GetProperty("Property", _declaredInstanceBindingFlags));

            Assert.That(property.PropertyBuilder.Name, Is.EqualTo("Property"));

            property.SetMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithProperty).GetMethod("set_Property", _declaredInstanceBindingFlags));
            property.SetMethod.AddStatement(new ReturnStatement());

            classEmitter.BuildType();
        }
Ejemplo n.º 7
0
        public void CreatePublicInterfacePropertyImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "CreatePublicInterfacePropertyImplementation", typeof(object), new[] { typeof(IInterfaceWithProperty) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            CustomPropertyEmitter property = classEmitter.CreatePublicInterfacePropertyImplementation(
                typeof(IInterfaceWithProperty).GetProperty("Property", _declaredInstanceBindingFlags));

            Assert.That(property.GetMethod, Is.Null);
            Assert.That(property.SetMethod, Is.Null);

            property.SetMethod = classEmitter.CreateInterfaceMethodImplementation(
                typeof(IInterfaceWithProperty).GetMethod("set_Property", _declaredInstanceBindingFlags));
            property.SetMethod.AddStatement(new ReturnStatement());

            Type builtType = classEmitter.BuildType();

            var instance = (IInterfaceWithProperty)Activator.CreateInstance(builtType);

            instance.Property = 7;
        }
Ejemplo n.º 8
0
        public void MethodNameAndVisibilityAreChangedOnInterfaceImplementation()
        {
            var classEmitter = new CustomClassEmitter(Scope, "MethodNameAndVisibilityAreChangedOnInterfaceImplementation", typeof(object), new[] { typeof(ICloneable) },
                                                      TypeAttributes.Public | TypeAttributes.Class, false);

            var method =
                classEmitter.CreateInterfaceMethodImplementation(typeof(ICloneable).GetMethod("Clone", _declaredInstanceBindingFlags));

            method.AddStatement(new ReturnStatement());

            Type builtType = classEmitter.BuildType();

            MethodInfo implementedMethod = builtType.GetMethod("System.ICloneable.Clone", _declaredInstanceBindingFlags);

            Assert.That(implementedMethod.Name, Is.EqualTo("System.ICloneable.Clone"));
            Assert.That(implementedMethod.IsPublic, Is.False);
            Assert.That(implementedMethod.IsPrivate, Is.True);
            Assert.That(implementedMethod.IsFinal, Is.True);
            Assert.That(implementedMethod.IsStatic, Is.False);
            Assert.That(implementedMethod.IsSpecialName, Is.False);
            Assert.That(implementedMethod.Attributes & MethodAttributes.NewSlot, Is.EqualTo(MethodAttributes.NewSlot));
        }
Ejemplo n.º 9
0
        public ForwardingProxyBuilder(string name, ModuleScope moduleScope, Type proxiedType, Type[] interfaces)
        {
            ArgumentUtility.CheckNotNullOrEmpty("name", name);
            ArgumentUtility.CheckNotNull("moduleScope", moduleScope);
            ArgumentUtility.CheckNotNull("proxiedType", proxiedType);
            ArgumentUtility.CheckNotNullOrItemsNull("interfaces", interfaces);

            _proxiedType  = proxiedType;
            _classEmitter = CreateClassEmitter(name, interfaces, moduleScope);
            _proxied      = CreateProxiedField();
            CreateProxyCtor(proxiedType);

            _classEmitter.TypeBuilder.AddInterfaceImplementation(typeof(IProxy));

            var setProxiedMethod = _classEmitter.CreateInterfaceMethodImplementation(
                typeof(IProxy).GetMethod("SetProxied", _declaredInstanceBindingFlags));
            var arg = setProxiedMethod.ArgumentReferences[0];
            var argAsProxiedType = new ConvertExpression(proxiedType, arg.ToExpression());

            setProxiedMethod.AddStatement(new AssignStatement(_proxied, argAsProxiedType));
            setProxiedMethod.AddStatement(new ReturnStatement());
        }