You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by gb...@apache.org on 2006/04/09 20:24:56 UTC

svn commit: r392799 - in /ibatis/trunk/cs/mapper: IBatisNet.Common.Test/Domain/ IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ IBatisNet.Common/Utilities/Objects/ IBatisNet.Common/Utilities/Objects/Members/ IBatisNet.DataMapper/Configuration/Result...

Author: gbayon
Date: Sun Apr  9 11:24:53 2006
New Revision: 392799

URL: http://svn.apache.org/viewcvs?rev=392799&view=rev
Log:
- refactoring IObjectFactory and IFactory to allow future constructor mapping in ResultMap

Modified:
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/Statement.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs Sun Apr  9 11:24:53 2006
@@ -13,6 +13,53 @@
         private string _lastName = string.Empty;
         private string _emailAddress = string.Empty;
 		private int[] _ids = null;
+		private string _test = string.Empty;
+		private Days _days ;
+		private Property _prop = null ;
+
+		public Account()
+		{}
+
+		public Account(int id)
+		{
+			_id = id;
+		}
+
+		public Account(string test)
+		{
+			_test = test;
+		}
+
+		public Account(Days days)
+		{
+			_days = days;
+		}
+
+		public Account(Property prop)
+		{
+			_prop = prop;
+		}
+
+		public Account(string firstName, Property prop)
+		{
+			_firstName = firstName;
+			_prop = prop;
+		}
+
+		public Property Property
+		{
+			get { return _prop; }
+		}
+
+		public Days Days
+		{
+			get { return _days; }
+		}
+
+		public string Test
+		{
+			get { return _test; }
+		}
 
 		public int Id
 		{

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs Sun Apr  9 11:24:53 2006
@@ -2,15 +2,15 @@
 
 namespace IBatisNet.Common.Test.Domain
 {
-    public enum Days
+    public enum Days : int
     {
         Sat = 1,
-        Sun,
-        Mon,
-        Tue,
-        Wed,
-        Thu,
-        Fri
+        Sun = 2,
+        Mon = 3,
+        Tue = 4,
+        Wed = 5,
+        Thu = 6,
+        Fri = 7
     };
 
 	/// <summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs Sun Apr  9 11:24:53 2006
@@ -11,20 +11,131 @@
 	{
 
 		[Test]
+		public void DynamicFactoryWithConstructor0()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(string)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = {"gilles"};
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.AreEqual("gilles", account.Test);
+		}
+
+		[Test]
+		public void DynamicFactoryWithConstructor1()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(string)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = new object[1];
+			parameters[0] = null;
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.AreEqual(null, account.Test);
+		}
+
+		[Test]
+		public void DynamicFactoryWithConstructor2()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(int)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = new object[1];
+			parameters[0] = -55;
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.AreEqual( -55, account.Id);
+		}
+
+		[Test]
+		public void DynamicFactoryWithConstructor3()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(Days)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = new object[1];
+			parameters[0] = Days.Sun;
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.AreEqual( Days.Sun, account.Days);
+		}
+
+		[Test]
+		public void DynamicFactoryWithConstructor4()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(Property)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = new object[1];
+			Property prop = new Property();
+			prop.String = "Gilles";
+			parameters[0] = prop;
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.IsNotNull(account.Property);
+			Assert.AreEqual( "Gilles", account.Property.String);
+		}
+
+		[Test]
+		public void DynamicFactoryWithConstructor5()
+		{
+			IObjectFactory objectFactory = new ObjectFactory(true);
+
+			Type[] types = {typeof(string), typeof(Property)};
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), types );
+
+			object[] parameters = new object[2];
+			Property prop = new Property();
+			prop.String = "Gilles";
+			parameters[0] = "Héloïse";
+			parameters[1] = prop;
+			object obj = factory.CreateInstance(parameters);
+
+			Assert.IsTrue(obj is Account);
+			Account account = (Account)obj;
+			Assert.AreEqual("Héloïse", account.FirstName);
+			Assert.IsNotNull(account.Property);
+			Assert.AreEqual( "Gilles", account.Property.String);
+		}
+
+
+
+		[Test]
 		public void DynamicFactoryCreatesTypes()
 		{
 			IObjectFactory objectFactory = new ObjectFactory(true);
 
-			IFactory factory = objectFactory.CreateFactory(typeof (Account));
-			object obj = factory.CreateInstance();
+			IFactory factory = objectFactory.CreateFactory(typeof (Account), Type.EmptyTypes);
+			object obj = factory.CreateInstance(null);
 			Assert.IsTrue(obj is Account);
 
-			factory = objectFactory.CreateFactory(typeof (Account));
-			obj = factory.CreateInstance();
+			factory = objectFactory.CreateFactory(typeof (Account), Type.EmptyTypes);
+			obj = factory.CreateInstance(Type.EmptyTypes);
 			Assert.IsTrue(obj is Account);
 
-			factory = objectFactory.CreateFactory(typeof (Simple));
-			obj = factory.CreateInstance();
+			factory = objectFactory.CreateFactory(typeof (Simple), Type.EmptyTypes);
+			obj = factory.CreateInstance(Type.EmptyTypes);
 			Assert.IsTrue(obj is Simple);
 		}
 
@@ -39,7 +150,7 @@
 
 			// create an instance so that Activators can
 			// cache the type/constructor/whatever
-			factory.CreateInstance();
+			factory.CreateInstance(Type.EmptyTypes);
 
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
@@ -48,18 +159,18 @@
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				factory.CreateInstance();
+				factory.CreateInstance(Type.EmptyTypes);
 			}
 			timer.Stop();
 			double newFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
 			#endregion
 
 			#region activator
-			factory = new ActivatorObjectFactory().CreateFactory(typeof(Account));
+			factory = new ActivatorObjectFactory().CreateFactory(typeof(Account), Type.EmptyTypes);
 
 			// create an instance so that Activators can
 			// cache the type/constructor/whatever
-			factory.CreateInstance();
+			factory.CreateInstance(Type.EmptyTypes);
 
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
@@ -67,18 +178,18 @@
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				factory.CreateInstance();
+				factory.CreateInstance(Type.EmptyTypes);
 			}
 			timer.Stop();
 			double activatorFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
 			#endregion
 
 			#region Emit
-			factory = new EmitObjectFactory().CreateFactory(typeof(Account));
+			factory = new EmitObjectFactory().CreateFactory(typeof(Account), Type.EmptyTypes);
 
 			// create an instance so that Activators can
 			// cache the type/constructor/whatever
-			factory.CreateInstance();
+			factory.CreateInstance(Type.EmptyTypes);
 
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
@@ -86,7 +197,7 @@
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				factory.CreateInstance();
+				factory.CreateInstance(Type.EmptyTypes);
 			}
 			timer.Stop();
 			double emitFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -103,10 +214,11 @@
 
 		internal class NewAccountFactory : IFactory
 		{
-			public object CreateInstance()
+			public object CreateInstance(object[] parameters)
 			{
 				return new Account();
 			}
+
 		}
 
 	}

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs Sun Apr  9 11:24:53 2006
@@ -44,14 +44,32 @@
 		}
 
 		#region IFactory members
+//
+//		/// <summary>
+//		/// Create a new object instance via via Activator.CreateInstance
+//		/// </summary>
+//		/// <returns>A new instance</returns>
+//		public object CreateInstance()
+//		{
+//			return Activator.CreateInstance( _typeToCreate );
+//		}
 
+		
 		/// <summary>
-		/// Create a new object instance via via Activator.CreateInstance
+		/// Create a new instance with the specified parameters
 		/// </summary>
-		/// <returns></returns>
-		public object CreateInstance()
+		/// <param name="parameters">
+		/// An array of values that matches the number, order and type 
+		/// of the parameters for this constructor. 
+		/// </param>
+		/// <remarks>
+		/// If you call a constructor with no parameters, pass null. 
+		/// Anyway, what you pass will be ignore.
+		/// </remarks>
+		/// <returns>A new instance</returns>
+		public object CreateInstance(object[] parameters)
 		{
-			return Activator.CreateInstance( _typeToCreate );
+			return Activator.CreateInstance( _typeToCreate, parameters );
 		}
 
 		#endregion

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs Sun Apr  9 11:24:53 2006
@@ -39,9 +39,10 @@
 		/// <summary>
 		/// Create a new factory instance for a given type
 		/// </summary>
-		/// <param name="typeToCreate"></param>
-		/// <returns></returns>
-		public IFactory CreateFactory(Type typeToCreate)
+		/// <param name="typeToCreate">The type instance to build</param>
+		/// <param name="types">The types of the constructor arguments</param>
+		/// <returns>Returns a new instance factory</returns>
+		public IFactory CreateFactory(Type typeToCreate, Type[] types)
 		{
 			return new ActivatorFactory( typeToCreate );
 		}

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs Sun Apr  9 11:24:53 2006
@@ -26,6 +26,7 @@
 using System;
 using System.Collections;
 using System.Collections.Specialized;
+using System.Text;
 
 namespace IBatisNet.Common.Utilities.Objects
 {
@@ -51,26 +52,49 @@
 		/// <summary>
 		/// Create a new factory instance for a given type
 		/// </summary>
-		/// <param name="typeToCreate"></param>
-		/// <returns></returns>
-		public IFactory CreateFactory(Type typeToCreate)
+		/// <param name="typeToCreate">The type instance to build</param>
+		/// <param name="types">The types of the constructor arguments</param>
+		/// <returns>Returns a new instance factory</returns>
+		public IFactory CreateFactory(Type typeToCreate, Type[] types)
 		{
-			IFactory factory = (IFactory) _cachedfactories[typeToCreate];
+			string key = GenerateKey(typeToCreate, types);
+
+			IFactory factory = _cachedfactories[key] as IFactory;
 			if (factory == null)
 			{
 				lock (_padlock)
 				{
-					factory = (IFactory) _cachedfactories[typeToCreate];
+					factory = _cachedfactories[key] as IFactory;
 					if (factory == null) // double-check
 					{
-						factory = _factoryBuilder.CreateFactory(typeToCreate);
-						_cachedfactories[typeToCreate] = factory;
+						factory = _factoryBuilder.CreateFactory(typeToCreate, types);
+						_cachedfactories[key] = factory;
 					}
 				}
 			}
 			return factory;
 		}
 
+		/// <summary>
+		/// Generates the key for a cache entry.
+		/// </summary>
+		/// <param name="typeToCreate">The type instance to build.</param>
+		/// <param name="arguments">The types of the constructor arguments</param>
+		/// <returns>The key for a cache entry.</returns>
+		private string GenerateKey(Type typeToCreate, object[] arguments)
+		{
+			StringBuilder cacheKey = new StringBuilder();
+			cacheKey.Append(typeToCreate.ToString());
+			cacheKey.Append(".");
+			if ((arguments != null) && (arguments.Length != 0)) 
+			{
+				for (int i=0; i<arguments.Length; i++) 
+				{
+					cacheKey.Append(".").Append(arguments[i]);
+				}
+			}
+			return cacheKey.ToString();
+		}
 		#endregion
 	}
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs Sun Apr  9 11:24:53 2006
@@ -24,6 +24,7 @@
 #endregion
 
 using System;
+using System.Collections;
 using System.Reflection;
 using System.Reflection.Emit;
 using IBatisNet.Common.Exceptions;
@@ -52,14 +53,15 @@
 
 
 		/// <summary>
-		/// 
+		/// Create a factory which build class of type typeToCreate
 		/// </summary>
-		/// <param name="typeToCreate"></param>
-		/// <returns></returns>
-		public IFactory CreateFactory(Type typeToCreate)
+		/// <param name="typeToCreate">The type instance to build</param>
+		/// <param name="types">The types of the constructor arguments</param>
+		/// <returns>Returns a new instance factory</returns>
+		public IFactory CreateFactory(Type typeToCreate, Type[] types)
 		{
-			Type innerType = CreateFactoryType(typeToCreate);
-			ConstructorInfo ctor = innerType.GetConstructor(new Type[] {});
+			Type innerType = CreateFactoryType(typeToCreate, types);
+			ConstructorInfo ctor = innerType.GetConstructor(Type.EmptyTypes);
 			return (IFactory) ctor.Invoke(new object[] {});
 		}
 
@@ -68,31 +70,108 @@
 		/// 
 		/// </summary>
 		/// <param name="typeToCreate"></param>
+		/// <param name="types"></param>
 		/// <returns></returns>
-		private Type CreateFactoryType(Type typeToCreate)
+		private Type CreateFactoryType(Type typeToCreate, Type[] types)
 		{
 			TypeBuilder typeBuilder = _moduleBuilder.DefineType("EmitFactoryFor" + typeToCreate.Name, TypeAttributes.Public);
 			typeBuilder.AddInterfaceImplementation(typeof (IFactory));
-			ImplementCreateInstance(typeBuilder, typeToCreate);
+			ImplementCreateInstance(typeBuilder, typeToCreate, types);
 			return typeBuilder.CreateType();
 		}
 
 		
 		private MethodAttributes createMethodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final;
 
-		private void ImplementCreateInstance(TypeBuilder typeBuilder, Type typeToCreate)
+		private void ImplementCreateInstance(TypeBuilder typeBuilder, Type typeToCreate, Type[] argumentTypes )
 		{
-			MethodBuilder meth = typeBuilder.DefineMethod("CreateInstance", createMethodAttributes, typeof (object), Type.EmptyTypes);
+			// object CreateInstance(object[] parameters);
+			MethodBuilder meth = typeBuilder.DefineMethod("CreateInstance", createMethodAttributes, typeof (object), new Type[]{typeof(object[])} );
 			ILGenerator il = meth.GetILGenerator();
 
 			// Add test if contructeur not public
-			ConstructorInfo ctor = typeToCreate.GetConstructor(Type.EmptyTypes);
+			ConstructorInfo ctor = typeToCreate.GetConstructor(argumentTypes);
 			if (!ctor.IsPublic)
 			{
-				throw new ProbeException(string.Format("Unable to optimize create instance for type \"{0}\". Cause no public constructor on type. ", typeToCreate.Name));
+				throw new ProbeException(
+					string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name));
+			}
+			if (argumentTypes==Type.EmptyTypes)// no parameters
+			{
+				// new typeToCreate()
+				il.Emit(OpCodes.Newobj, ctor);
+				il.Emit(OpCodes.Ret);
+			}
+			else
+			{
+				// new typeToCreate(... arguments ...)
+				EmitArgsIL(il, argumentTypes);
+				il.Emit(OpCodes.Newobj, ctor);
+				il.Emit(OpCodes.Ret);				
 			}
-			il.Emit(OpCodes.Newobj, ctor);
-			il.Emit(OpCodes.Ret);
 		}
+
+		/// <summary>   
+		/// Emit parameter IL for a method call.   
+		/// </summary>   
+		/// <param name="il">IL generator.</param>   
+		/// <param name="argumentTypes">Arguments type defined for a the constructor.</param>   
+		private void EmitArgsIL(ILGenerator il, Type[] argumentTypes)   
+		{   
+			// Add args. Since all args are objects, value types are unboxed. 
+			// Refs to value types are to be converted to values themselves.   
+			for (int i = 0; i < argumentTypes.Length; i++)   
+			{   
+				// Push args array reference on the stack , followed by the index.   
+				// Ldelem will resolve them to args[i].   
+				il.Emit(OpCodes.Ldarg_1);   // Argument 1 is argument array.
+				il.Emit(OpCodes.Ldc_I4, i);   
+				il.Emit(OpCodes.Ldelem_Ref);
+
+				// If param is a value type then we need to unbox it.   
+				Type paramType = argumentTypes[i];   
+				if (paramType.IsValueType)   
+				{   
+					il.Emit(OpCodes.Unbox, paramType);  
+					il.Emit(BoxingOpCodes.GetOpCode(paramType)); 
+				}  
+
+			}   
+		 }   
+
+		/// <summary>  
+		/// Helper class that returns appropriate boxing opcode based on type  
+		/// </summary>  
+		/// <remarks>From Spring.NET</remarks>
+		internal class BoxingOpCodes  
+		{  
+			private static IDictionary boxingOpCodes;  
+ 
+			static BoxingOpCodes()  
+			{  
+				boxingOpCodes = new Hashtable();  
+				boxingOpCodes[typeof(sbyte)] = OpCodes.Ldind_I1;  
+				boxingOpCodes[typeof(short)] = OpCodes.Ldind_I2;  
+				boxingOpCodes[typeof(int)] = OpCodes.Ldind_I4;  
+				boxingOpCodes[typeof(long)] = OpCodes.Ldind_I8;  
+				boxingOpCodes[typeof(byte)] = OpCodes.Ldind_U1;  
+				boxingOpCodes[typeof(ushort)] = OpCodes.Ldind_U2;  
+				boxingOpCodes[typeof(uint)] = OpCodes.Ldind_U4;  
+				boxingOpCodes[typeof(ulong)] = OpCodes.Ldind_I8;  
+				boxingOpCodes[typeof(float)] = OpCodes.Ldind_R4;  
+				boxingOpCodes[typeof(double)] = OpCodes.Ldind_R8;  
+				boxingOpCodes[typeof(char)] = OpCodes.Ldind_U2;  
+				boxingOpCodes[typeof(bool)] = OpCodes.Ldind_I1;  
+			}  
+ 
+			public static OpCode GetOpCode(Type type)  
+			{  
+				if (type.IsEnum)  
+				{  
+					type = Enum.GetUnderlyingType(type);  
+				}  
+				return (OpCode) boxingOpCodes[type];  
+			}  
+		} 
 	}
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IFactory.cs Sun Apr  9 11:24:53 2006
@@ -31,9 +31,24 @@
 	/// </summary>
 	public interface IFactory
 	{
+//		/// <summary>
+//		/// Create a new instance
+//		/// </summary>
+//		/// <returns>A new instance</returns>
+//		object CreateInstance();
+
 		/// <summary>
-		/// Create a new instance
+		/// Create a new instance with the specified parameters
 		/// </summary>
-		object CreateInstance();
+		/// <param name="parameters">
+		/// An array of values that matches the number, order and type 
+		/// of the parameters for this constructor. 
+		/// </param>
+		/// <remarks>
+		/// If you call a constructor with no parameters, pass null. 
+		/// Anyway, what you pass will be ignore.
+		/// </remarks>
+		/// <returns>A new instance</returns>
+		object CreateInstance(object[] parameters);
 	}
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs Sun Apr  9 11:24:53 2006
@@ -36,8 +36,9 @@
 		/// <summary>
 		/// Create a new factory instance for a given type
 		/// </summary>
-		/// <param name="typeToCreate"></param>
-		/// <returns></returns>
-		IFactory CreateFactory(Type typeToCreate);
+		/// <param name="typeToCreate">The type instance to build</param>
+		/// <param name="types">The types of the constructor arguments</param>
+		/// <returns>Returns a new instance factory</returns>
+		IFactory CreateFactory(Type typeToCreate, Type[] types);
 	}
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs Sun Apr  9 11:24:53 2006
@@ -187,11 +187,13 @@
 			constructorIL.Emit(OpCodes.Ldarg_0);
 			// Call the base constructor (no args)
 			constructorIL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
+			// this._name = memberName
 			// Load "this"
 			constructorIL.Emit(OpCodes.Ldarg_0);
 			// Store name in field "_name"
 			constructorIL.Emit(OpCodes.Ldstr, memberName);
 			constructorIL.Emit(OpCodes.Stfld, fieldBuilderName);
+			// this._memberType = baseMemberType
 			// Store type in field "_memberType"
 //			constructorIL.Emit(OpCodes.Ldtoken, baseMemberType);
 //			MethodInfo miGetTypeFromHandle = typeof(System.Type).GetMethod("GetTypeFromHandle", new Type[] {typeof(System.RuntimeTypeHandle)});

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs Sun Apr  9 11:24:53 2006
@@ -66,11 +66,12 @@
 		/// <summary>
 		/// Create a new factory instance for a given type
 		/// </summary>
-		/// <param name="typeToCreate"></param>
-		/// <returns></returns>
-		public IFactory CreateFactory(Type typeToCreate)
+		/// <param name="typeToCreate">The type instance to build</param>
+		/// <param name="types">The types of the constructor arguments</param>
+		/// <returns>Returns a new instance factory</returns>
+		public IFactory CreateFactory(Type typeToCreate, Type[] types)
 		{
-			return _objectFactory.CreateFactory(typeToCreate);
+			return _objectFactory.CreateFactory(typeToCreate, types);
 		}
 
 		#endregion

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs Sun Apr  9 11:24:53 2006
@@ -457,8 +457,8 @@
 					{
 						try 
 						{
-							IFactory factory = objectFactory.CreateFactory(type);
-							child = factory.CreateInstance();
+							IFactory factory = objectFactory.CreateFactory(type, Type.EmptyTypes);
+							child = factory.CreateInstance(Type.EmptyTypes);
 
 							SetMemberValue(parent, currentPropertyName, child, objectFactory, memberAccessorFactory);
 						} 

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs Sun Apr  9 11:24:53 2006
@@ -210,7 +210,7 @@
 
 				if (Type.GetTypeCode(_class) == TypeCode.Object)
 				{
-					_objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class);
+					_objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class, Type.EmptyTypes);
 				}
 
 				// Load the child node
@@ -290,7 +290,7 @@
 
 			if (typeCode == TypeCode.Object)
 			{
-				return _objectFactory.CreateInstance();
+				return _objectFactory.CreateInstance(null);
 			}
 			else
 			{

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/Statement.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/Statement.cs?rev=392799&r1=392798&r2=392799&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/Statement.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Statements/Statement.cs Sun Apr  9 11:24:53 2006
@@ -319,7 +319,7 @@
 				if (Type.GetTypeCode(_resultClass) == TypeCode.Object &&
 					(_resultClass.IsValueType == false))
 				{
-					_resultClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_resultClass);	
+					_resultClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_resultClass, Type.EmptyTypes);	
 				}
 			}
 			if (_parameterClassName != string.Empty )
@@ -329,7 +329,7 @@
 			if (_listClassName != string.Empty )
 			{
 				_listClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(_listClassName);
-                _listClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_listClass);
+                _listClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_listClass, Type.EmptyTypes);
 			}
 		}
 
@@ -365,7 +365,7 @@
 				}
 				else
 				{
-					return _resultClassFactory.CreateInstance();
+					return _resultClassFactory.CreateInstance(null);
 				}
 			}
 		}
@@ -377,7 +377,7 @@
 		/// <returns>An object which implment IList.</returns>
 		public IList CreateInstanceOfListClass()
 		{
-            return (IList)_listClassFactory.CreateInstance(); ;
+            return (IList)_listClassFactory.CreateInstance(null); ;
 		}
 		#endregion