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); }
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); }
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); }; }
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; }
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(); }
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; }
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)); }
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()); }