internal static T GetInterceptingInstance <T>(params object[] ctorValues) { Type typeToIntercept = typeof(T); if (typeToIntercept.IsGenericType) { typeToIntercept = typeToIntercept.GetGenericTypeDefinition(); } global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeToIntercept); Type generatedType = generator.GenerateType(); if (generatedType.IsGenericTypeDefinition) { generatedType = generatedType.MakeGenericType(typeof(T).GetGenericArguments()); } return((T)Activator.CreateInstance(generatedType, ctorValues)); }
public void CanInterceptClassWithReservedTypeAttributes() { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(ClassWithPermissionAttribute)); Type generatedType = generator.GenerateType(); ClassWithPermissionAttribute instance = (ClassWithPermissionAttribute)Activator.CreateInstance(generatedType); int intercepts = 0; ((IInterceptingProxy)instance) .AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, gn) => { intercepts++; return(gn()(mi, gn)); })); instance.Method(); Assert.AreEqual(1, intercepts); }
public void InterceptingClassOverridesBaseClassVirtualMethods() { Type baseType = typeof(ClassWithDefaultCtor); VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor(); global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(baseType); Type generatedType = generator.GenerateType(); MethodInfo methodOne = generatedType.GetMethod("MethodOne"); MethodInfo calculateAnswer = generatedType.GetMethod("CalculateAnswer"); Assert.AreSame(generatedType, methodOne.DeclaringType); Assert.AreSame(generatedType, calculateAnswer.DeclaringType); }
public void DoesNotReImplementAdditionalInterfaceAlreadyImplementedByInterceptedClass() { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(InterfaceImplementingMainType), typeof(IDeriveFromIDoSomething)); Type generatedType = generator.GenerateType(); object instance = Activator.CreateInstance(generatedType); List <MethodBase> interceptedMethods = new List <MethodBase>(); ((IInterceptingProxy)instance) .AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, n) => { interceptedMethods.Add(mi.MethodBase); return(mi.CreateMethodReturn(1)); })); ((InterfaceImplementingMainType)instance).DoSomething(); ((InterfaceImplementingMainType)instance).DoSomething(String.Empty); ((IDoSomething)instance).DoSomething(); ((IDoSomething)instance).DoSomething(String.Empty); ((IDeriveFromIDoSomething)instance).DoSomething(); ((IDeriveFromIDoSomething)instance).DoSomething(String.Empty); ((IDeriveFromIDoSomething)instance).DoSomethingElse(); Assert.AreEqual(4, interceptedMethods.Count); // only the virtual implicit method implementation is invoked for IDoSomething Assert.AreSame( StaticReflection.GetMethodInfo <InterfaceImplementingMainType>(i => i.DoSomething(null)), interceptedMethods[0]); Assert.AreSame( StaticReflection.GetMethodInfo <InterfaceImplementingMainType>(i => i.DoSomething(null)), interceptedMethods[1]); Assert.AreSame( StaticReflection.GetMethodInfo <InterfaceImplementingMainType>(i => i.DoSomething(null)), interceptedMethods[2]); Assert.AreSame( StaticReflection.GetMethodInfo <IDeriveFromIDoSomething>(i => i.DoSomethingElse()), interceptedMethods[3]); }
public void CanInterceptMixedPublicProtectedVirtualProperties() { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(ClassWithMixedPublicProtectedProperty)); Type generatedType = generator.GenerateType(); ClassWithMixedPublicProtectedProperty instance = (ClassWithMixedPublicProtectedProperty)Activator.CreateInstance(generatedType); int intercepts = 0; ((IInterceptingProxy)instance) .AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, gn) => { intercepts++; return(gn()(mi, gn)); })); instance.SetProperty(10); int value = instance.GetProperty(); Assert.AreEqual(10, value); Assert.AreEqual(2, intercepts); }
public void CanImplementAdditionalInterfaceWithMethodsHavingSignaturesMatchingMethodsInTheBaseClass() { // arrange global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IDoSomething)); Type generatedType = generator.GenerateType(); // act object instance = Activator.CreateInstance(generatedType); // assert Assert.IsTrue(instance is MainType); Assert.IsTrue(instance is IDoSomething); }
public void CanInvokeMethodsFromDifferentTypesWithMatchingSignatures() { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IDoSomething), typeof(IDoSomethingToo)); Type generatedType = generator.GenerateType(); object instance = Activator.CreateInstance(generatedType); List <MethodBase> invokedMethods = new List <MethodBase>(); ((IInterceptingProxy)instance) .AddInterceptionBehavior( new DelegateInterceptionBehavior((mi, n) => { invokedMethods.Add(mi.MethodBase); return(mi.CreateMethodReturn(1)); })); ((MainType)instance).DoSomething(); ((IDoSomething)instance).DoSomething(); ((IDoSomethingToo)instance).DoSomething(); Assert.AreSame(StaticReflection.GetMethodInfo <MainType>(i => i.DoSomething()), invokedMethods[0]); Assert.AreSame(StaticReflection.GetMethodInfo <IDoSomething>(i => i.DoSomething()), invokedMethods[1]); Assert.AreSame(StaticReflection.GetMethodInfo <IDoSomethingToo>(i => i.DoSomething()), invokedMethods[2]); }
public void CanImplementINotifyPropertyChanged() { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(INotifyPropertyChanged)); Type generatedType = generator.GenerateType(); object instance = Activator.CreateInstance(generatedType); string changeProperty = null; PropertyChangedEventHandler handler = (sender, args) => changeProperty = args.PropertyName; ((IInterceptingProxy)instance).AddInterceptionBehavior(new NaiveINotifyPropertyChangedInterceptionBehavior()); ((INotifyPropertyChanged)instance).PropertyChanged += handler; ((MainType)instance).IntProperty = 100; Assert.AreEqual(100, ((MainType)instance).IntProperty); Assert.AreEqual("IntProperty", changeProperty); changeProperty = null; ((INotifyPropertyChanged)instance).PropertyChanged -= handler; ((MainType)instance).IntProperty = 200; Assert.AreEqual(200, ((MainType)instance).IntProperty); Assert.AreEqual(null, changeProperty); }
public void CanSuccessfullyInvokeAnAdditionalInterfaceMethodIfAnInterceptorDoesNotForwardTheCall() { // arrange global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IAdditionalInterface)); Type generatedType = generator.GenerateType(); object instance = Activator.CreateInstance(generatedType); bool invoked = false; ((IInterceptingProxy)instance).AddInterceptionBehavior( new DelegateInterceptionBehavior( (input, getNext) => { invoked = true; return(input.CreateMethodReturn(100)); })); // act int result = ((IAdditionalInterface)instance).DoSomethingElse(); // assert Assert.IsTrue(invoked); Assert.AreEqual(100, result); }
public void InvokingMethodOnAdditionalInterfaceThrowsIfNotHandledByInterceptor() { // arrange global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IAdditionalInterface)); Type generatedType = generator.GenerateType(); object instance = Activator.CreateInstance(generatedType); // act Exception exception = null; try { ((IAdditionalInterface)instance).DoSomethingElse(); Assert.Fail("should have thrown"); } catch (NotImplementedException e) { exception = e; } // assert Assert.IsNotNull(exception); }
public void CanImplementAdditionalInterfaces() { // arrange global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IAdditionalInterface)); Type generatedType = generator.GenerateType(); // act object instance = Activator.CreateInstance(generatedType); // assert Assert.IsTrue(instance is MainType); Assert.IsTrue(instance is IAdditionalInterface); }
public void GeneratedTypeForAdditionalInterfaceWithMethodsHavingSignaturesMatchingMethodsInTheBaseClassIsVerifiable() { PermissionSet grantSet = new PermissionSet(PermissionState.None); grantSet.AddPermission( new SecurityPermission( SecurityPermissionFlag.Execution | SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)); grantSet.AddPermission( new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess | ReflectionPermissionFlag.MemberAccess)); grantSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); AppDomain sandbox = AppDomain.CreateDomain( "sandbox", AppDomain.CurrentDomain.Evidence, new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory }, grantSet); sandbox.DoCallBack(() => { global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator generator = new global::Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration.InterceptingClassGenerator(typeof(MainType), typeof(IDoSomething), typeof(IDoSomethingToo)); Type generatedType = generator.GenerateType(); }); }