|
From: <sm...@us...> - 2003-08-13 20:58:31
|
Update of /cvsroot/nmock/nmock/src/NMock/Dynamic
In directory sc8-pr-cvs1:/tmp/cvs-serv8466/src/NMock/Dynamic
Modified Files:
ClassGenerator.cs
Log Message:
Pushed parameters into fields in ClassGenerator
Moved superclassIfTypeIsAnInterface into field
Removed RemotingClasssGenerator
Index: ClassGenerator.cs
===================================================================
RCS file: /cvsroot/nmock/nmock/src/NMock/Dynamic/ClassGenerator.cs,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** ClassGenerator.cs 13 Aug 2003 19:42:39 -0000 1.15
--- ClassGenerator.cs 13 Aug 2003 20:44:13 -0000 1.16
***************
*** 9,37 ****
public class ClassGenerator
{
! public static readonly string INVOCATION_HANDLER_FIELD_NAME = "_invocationHandler";
internal const System.Reflection.BindingFlags ALL_INSTANCE_METHODS
= BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
! public virtual object Generate(Type type, IInvocationHandler handler)
{
! return Generate(type, handler, new ArrayList());
}
! public virtual object Generate(Type type, IInvocationHandler handler, IList methodsToIgnore)
{
methodsToIgnore.Add("Equals");
methodsToIgnore.Add("ToString");
! TypeBuilder typeBuilder = GetTypeBuilder("Proxy" + type.Name, type);
! MethodImplementor methodImplementor = new MethodImplementor(typeBuilder,
! typeBuilder.DefineField(ClassGenerator.INVOCATION_HANDLER_FIELD_NAME,
! typeof(IInvocationHandler), FieldAttributes.Public));
foreach (Type currentType in new InterfaceLister().List(type))
{
foreach ( MethodInfo methodInfo in currentType.GetMethods(ALL_INSTANCE_METHODS) )
{
! if (ShouldImplement(methodInfo, methodsToIgnore))
{
methodImplementor.Implement(methodInfo);
--- 9,74 ----
public class ClassGenerator
{
! public const string INVOCATION_HANDLER_FIELD_NAME = "_invocationHandler";
internal const System.Reflection.BindingFlags ALL_INSTANCE_METHODS
= BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
! readonly protected Type type;
! readonly protected IInvocationHandler handler;
! readonly protected IList methodsToIgnore;
! readonly protected Type superclassIfTypeIsInterface;
!
! public ClassGenerator(Type type, IInvocationHandler handler)
! : this(type, handler, new ArrayList()) {}
!
! public ClassGenerator(Type type, IInvocationHandler handler, IList methodsToIgnore)
! : this(type, handler, methodsToIgnore, null) {}
!
! public ClassGenerator(Type type, IInvocationHandler handler, IList methodsToIgnore, Type superclassIfTypeIsInterface)
{
! this.type = type;
! this.handler = handler;
! this.methodsToIgnore = methodsToIgnore;
! this.superclassIfTypeIsInterface = superclassIfTypeIsInterface;
}
!
! public virtual object Generate()
{
methodsToIgnore.Add("Equals");
methodsToIgnore.Add("ToString");
! TypeBuilder typeBuilder = CreateTypeBuilder();
! MethodImplementor methodImplementor =
! new MethodImplementor(typeBuilder, DefineInvocationHandlerField(typeBuilder));
+ ImplementMethods(methodImplementor);
+ return CreateProxyInstance(typeBuilder.CreateType());
+ }
+
+ TypeBuilder CreateTypeBuilder()
+ {
+ AppDomain appDomain = AppDomain.CurrentDomain;
+ AssemblyName assemblyName = new AssemblyName();
+ assemblyName.Name = "DynamicProxyAssembly";
+ AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
+ ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MockModule");
+ return moduleBuilder.DefineType(ProxyClassName, TypeAttributes.Public, ProxySuperClass, ProxyInterfaces);
+ }
+
+ private FieldBuilder DefineInvocationHandlerField(TypeBuilder typeBuilder)
+ {
+ return typeBuilder.DefineField(
+ ClassGenerator.INVOCATION_HANDLER_FIELD_NAME,
+ typeof(IInvocationHandler), FieldAttributes.Public);
+ }
+
+ private void ImplementMethods(MethodImplementor methodImplementor)
+ {
foreach (Type currentType in new InterfaceLister().List(type))
{
foreach ( MethodInfo methodInfo in currentType.GetMethods(ALL_INSTANCE_METHODS) )
{
! if (ShouldImplement(methodInfo))
{
methodImplementor.Implement(methodInfo);
***************
*** 39,46 ****
}
}
- return CreateProxyInstance(typeBuilder, handler);
}
! bool ShouldImplement(MethodInfo methodInfo, IList methodsToIgnore)
{
if (!methodInfo.IsVirtual || methodInfo.IsFinal)
--- 76,82 ----
}
}
}
! private bool ShouldImplement(MethodInfo methodInfo)
{
if (!methodInfo.IsVirtual || methodInfo.IsFinal)
***************
*** 51,77 ****
}
! TypeBuilder GetTypeBuilder(string name, Type originalType)
! {
! AppDomain appDomain = AppDomain.CurrentDomain;
! AssemblyName assemblyName = new AssemblyName();
! assemblyName.Name = "DynamicProxyAssembly";
! AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
! ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MockModule");
! return moduleBuilder.DefineType(name, TypeAttributes.Public, getSuperClass(originalType), getInterfaces(originalType));
! }
!
! protected virtual Type getSuperClass(Type originalType)
! {
! return (originalType.IsInterface) ? null : originalType;
! }
!
! protected virtual Type[] getInterfaces(Type originalType)
! {
! return (originalType.IsInterface) ? new Type[] { originalType } : new Type[0];
! }
!
! object CreateProxyInstance(TypeBuilder typeBuilder, IInvocationHandler handler)
{
- Type proxyType = typeBuilder.CreateType();
object result = Activator.CreateInstance(proxyType);
--- 87,92 ----
}
! private object CreateProxyInstance(Type proxyType)
{
object result = Activator.CreateInstance(proxyType);
***************
*** 82,85 ****
--- 97,104 ----
}
+ public string ProxyClassName { get { return "Proxy" + type.Name; } }
+ public Type ProxySuperClass { get { return type.IsInterface ? superclassIfTypeIsInterface : type; } }
+ public Type[] ProxyInterfaces { get { return type.IsInterface ? new Type[] { type } : new Type[0]; } }
+
}
|