Author: gbayon
Date: Sun Mar 19 14:02:00 2006
New Revision: 387044

URL: http://svn.apache.org/viewcvs?rev=387044&view=rev
Log:
- Updated member accessor

Added:
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs
      - copied, changed from r386699, 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ILPropertyAccessor.cs
Removed:
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ILPropertyAccessor.cs
Modified:
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
    
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/DataSource.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/DbProvider.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitFieldAccessor.cs
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldAccessor.cs
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyAccessor.cs

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=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs Sun Mar 19 
14:02:00 2006
@@ -19,7 +19,7 @@
        public class Property
        {
                private string _string = string.Empty;
-               private int _int = int.MinValue;
+               public int _int = int.MinValue;
                private DateTime _dateTime = DateTime.MinValue;
                private decimal _decimal = decimal.MinValue;
                private sbyte _sbyte = sbyte.MinValue;

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs
 Sun Mar 19 14:02:00 2006
@@ -1,17 +1,49 @@
 using System;
+using System.Reflection;
+using IBatisNet.Common.Test.Domain;
+using IBatisNet.Common.Utilities;
+using IBatisNet.Common.Utilities.Objects.Members;
+using NUnit.Framework;
 
 namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities
 {
        /// <summary>
        /// Summary description for FieldAccessorTest.
        /// </summary>
+       [TestFixture] 
        public class FieldAccessorTest
        {
-               public FieldAccessorTest()
+               /// <summary>
+               /// Test setting an integer property.
+               /// </summary>
+               [Test]
+               public void TestSetInteger()
                {
-                       //
-                       // TODO: Add constructor logic here
-                       //
+                       Property prop = new Property();
+                       prop.Int = -99;
+
+                       // Property accessor
+                       MemberAccessorFactory factory = new 
MemberAccessorFactory(true);
+                       IMemberAccessor propertyAccessor = 
factory.CreateMemberAccessor(typeof(Property), "_int");
+                       int test = 57;
+                       propertyAccessor.Set(prop, test);
+                       Assert.AreEqual(test, prop.Int);
+               }
+
+               /// <summary>
+               /// Test getting an integer property.
+               /// </summary>
+               [Test]
+               public void TestGetInteger()
+               {
+                       int test = -99;
+                       Property prop = new Property();
+                       prop.Int = test;
+
+                       // Property accessor
+                       MemberAccessorFactory factory = new 
MemberAccessorFactory(true);
+                       IMemberAccessor propertyAccessor = 
factory.CreateMemberAccessor(typeof(Property), "_int");
+                       Assert.AreEqual(test, propertyAccessor.Get(prop));
                }
        }
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/DataSource.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/DataSource.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/DataSource.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/DataSource.cs Sun Mar 19 14:02:00 
2006
@@ -1,12 +1,12 @@
 
 #region Apache Notice
 /*****************************************************************************
- * $Header: $
- * $Revision: $
- * $Date$
+ * $Revision: 374175 $
+ * $LastChangedDate$
+ * $LastChangedBy$
  * 
  * iBATIS.NET Data Mapper
- * Copyright (C) 2004 - Gilles Bayon
+ * Copyright (C) 2006/2005 - The Apache Software Foundation
  *  
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/DbProvider.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/DbProvider.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/DbProvider.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/DbProvider.cs Sun Mar 19 14:02:00 
2006
@@ -1,12 +1,12 @@
 
 #region Apache Notice
 /*****************************************************************************
- * $Header: $
- * $Revision$
- * $Date$
+ * $Revision: 374175 $
+ * $LastChangedDate$
+ * $LastChangedBy$
  * 
  * iBATIS.NET Data Mapper
- * Copyright (C) 2004 - Gilles Bayon
+ * Copyright (C) 2006/2005 - The Apache Software Foundation
  *  
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -489,11 +489,12 @@
                        }
                }
 
+
                /// <summary>
                /// Create a connection object for this provider.
                /// </summary>
                /// <returns>An 'IDbConnection' object.</returns>
-               public IDbConnection CreateConnection()
+               public virtual IDbConnection CreateConnection()
                {
                        // Cannot do that because on 
                        // IDbCommand.Connection = cmdConnection
@@ -513,11 +514,12 @@
                        }
                }
 
+               
                /// <summary>
                /// Create a command object for this provider.
                /// </summary>
                /// <returns>An 'IDbCommand' object.</returns>
-               public IDbCommand CreateCommand()
+               public virtual IDbCommand CreateCommand()
                {
             return _templateConnection.CreateCommand();
                }
@@ -526,7 +528,7 @@
                /// Create a dataAdapter object for this provider.
                /// </summary>
                /// <returns>An 'IDbDataAdapter' object.</returns>
-               public IDbDataAdapter CreateDataAdapter()
+               public virtual IDbDataAdapter CreateDataAdapter()
                {
                        if (_templateDataAdapterIsICloneable)
                        {
@@ -539,12 +541,11 @@
                }
 
 
-
                /// <summary>
                /// Create a IDbDataParameter object for this provider.
                /// </summary>
                /// <returns>An 'IDbDataParameter' object.</returns>
-               public IDbDataParameter CreateDataParameter()
+               public virtual IDbDataParameter CreateDataParameter()
                {
             return _templateConnection.CreateCommand().CreateParameter();
                }
@@ -555,7 +556,7 @@
         /// </summary>
         /// <param name="parameterName">The unformatted name of the 
parameter</param>
         /// <returns>A parameter formatted for an 
IDbCommand.CommandText</returns>
-        public string FormatNameForSql(string parameterName)
+        public virtual string FormatNameForSql(string parameterName)
         {
             return _useParameterPrefixInSql ? (_parameterPrefix + 
parameterName) : SQLPARAMETER;
         }
@@ -569,7 +570,7 @@
         /// </remarks>
         /// <param name="parameterName">The unformatted name of the 
parameter</param>
         /// <returns>A parameter formatted for an IDbParameter.</returns>
-        public string FormatNameForParameter(string parameterName)
+        public virtual string FormatNameForParameter(string parameterName)
         {
             return _useParameterPrefixInParameter ? (_parameterPrefix + 
parameterName) : parameterName;
         }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj Sun Mar 19 
14:02:00 2006
@@ -350,7 +350,7 @@
                     BuildAction = "Compile"
                 />
                 <File
-                    RelPath = "Utilities\Objects\Members\ILPropertyAccessor.cs"
+                    RelPath = 
"Utilities\Objects\Members\EmitPropertyAccessor.cs"
                     SubType = "Code"
                     BuildAction = "Compile"
                 />

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitFieldAccessor.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitFieldAccessor.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitFieldAccessor.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitFieldAccessor.cs
 Sun Mar 19 14:02:00 2006
@@ -1,9 +1,34 @@
+#region Apache Notice
+/*****************************************************************************
+ * $Revision: 374175 $
+ * $LastChangedDate$
+ * $LastChangedBy$
+ * 
+ * iBATIS.NET Data Mapper
+ * Copyright (C) 2006/2005 - The Apache Software Foundation
+ *  
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ 
********************************************************************************/
+#endregion
+
 using System;
 using System.Collections;
 using System.Collections.Specialized;
 using System.Reflection;
 using System.Reflection.Emit;
-using IBatisNet.Common.Exceptions;
+
 
 namespace IBatisNet.Common.Utilities.Objects.Members
 {
@@ -11,6 +36,7 @@
        /// The EmitFieldAccessor class provides an IL-based access   
        /// to a field of a specified target class.
        /// </summary>
+       /// <remarks>Not Finish. Throw FieldAccessException on 
SetValue</remarks>
        public class EmitFieldAccessor : IMemberAccessor
        {
                private Type _targetType = null;
@@ -53,27 +79,169 @@
                /// <param name="moduleBuilder"></param>
                public EmitFieldAccessor(Type targetType, string fieldName, 
AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder)
                {
-                       this._assemblyBuilder = assemblyBuilder;
-                       this._moduleBuilder = moduleBuilder;
-                       this._targetType = targetType;
-                       this._fieldName = fieldName;
+                       _assemblyBuilder = assemblyBuilder;
+                       _moduleBuilder = moduleBuilder;
+                       _targetType = targetType;
+                       _fieldName = fieldName;
 
-                       FieldInfo fieldInfo = targetType.GetField(fieldName);
+                       FieldInfo fieldInfo = targetType.GetField(fieldName, 
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
 
-                       // Make sure the property exists
+                       // Make sure the field exists
                        if(fieldInfo == null)
                        {
-                               throw new ProbeException(
+                               throw new MissingMethodException(
                                        string.Format("Field \"{0}\" does not 
exist for type "
                                        + "{1}.", fieldName, targetType));
                        }
                        else
                        {
                                this._fieldType = fieldInfo.FieldType;
-//                             this.Emit();
+                               this.EmitIL();
+                       }
+               }
+
+               
+               /// <summary>
+               /// This method a new type oject for the the field accessor 
class 
+               /// that will provide dynamic access.
+               /// </summary>
+               private void EmitIL()
+               {
+                       // Create a new type oject for the the field accessor 
class.
+                       EmitType();
+
+                       // Create a new instance
+                       _emittedFieldAccessor = 
_assemblyBuilder.CreateInstance("FieldAccessorFor" + _targetType.FullName + 
_fieldName) as IMemberAccessor;
+            
+                       _nullInternal = GetNullInternal(_fieldType);
+
+                       if(_emittedFieldAccessor == null)
+                       {
+                               throw new MethodAccessException(
+                                       string.Format("Unable to create field 
accessor for \"{0}\".", _fieldType));
                        }
                }
 
+               
+               /// <summary>
+               /// Create an type that will provide the get and set methods.
+               /// </summary>
+               private void EmitType()
+               {
+                       // Define a public class named 
"FieldAccessorFor.FullTagetTypeName.FieldName" in the assembly.
+                       TypeBuilder typeBuilder = 
_moduleBuilder.DefineType("FieldAccessorFor" + _targetType.FullName + 
_fieldName, TypeAttributes.Class | TypeAttributes.Public | 
TypeAttributes.Sealed);
+
+                       // Mark the class as implementing IMemberAccessor. 
+                       
typeBuilder.AddInterfaceImplementation(typeof(IMemberAccessor));
+
+                       // Add a constructor
+                       
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
+
+                       // Define a method named "Get" for the get operation 
(IMemberAccessor). 
+                       Type[] getParamTypes = new Type[] {typeof(object)};
+                       MethodBuilder getMethod = 
typeBuilder.DefineMethod("Get", 
+                               MethodAttributes.Public | 
MethodAttributes.Virtual,
+                               typeof(object), 
+                               getParamTypes);
+
+                       // Get an ILGenerator and used it to emit the IL that 
we want.
+                       ILGenerator getIL = getMethod.GetILGenerator();
+
+                       FieldInfo targetField = 
_targetType.GetField(_fieldName, BindingFlags.NonPublic | BindingFlags.Instance 
| BindingFlags.Public);
+                       
+                       // Emit the IL for get access. 
+                       if(targetField != null)
+                       {
+                               getIL.Emit(OpCodes.Ldarg_1); 
+                               getIL.Emit(OpCodes.Castclass, 
targetField.DeclaringType); 
+                               getIL.Emit(OpCodes.Ldfld, targetField); 
+
+//                             getIL.DeclareLocal(typeof(object));
+//                             getIL.Emit(OpCodes.Ldarg_0);//Load the first 
argument,(target object)
+//                             getIL.Emit(OpCodes.Castclass, _targetType);     
//Cast to the source type
+//                             getIL.Emit(OpCodes.Ldfld, targetField);
+//                             if(targetField.FieldType.IsValueType)
+//                             {
+//                                     getIL.Emit(OpCodes.Box, 
targetField.FieldType); //Box if necessary
+//                             }
+//                             getIL.Emit(OpCodes.Stloc_0);
+//                             getIL.Emit(OpCodes.Ldloc_0);
+                       }
+                       else
+                       {
+                               
getIL.ThrowException(typeof(MissingMethodException));
+                       }
+                       getIL.Emit(OpCodes.Ret);
+
+                       // Define a method named "Set" for the set operation 
(IMemberAccessor).
+                       Type[] setParamTypes = new Type[] {typeof(object), 
typeof(object)};
+                       MethodBuilder setMethod = 
typeBuilder.DefineMethod("Set", 
+                               MethodAttributes.Public | 
MethodAttributes.Virtual, 
+                               null, 
+                               setParamTypes);
+
+                       // Get an ILGenerator and used to emit the IL that we 
want.
+                       ILGenerator setIL = setMethod.GetILGenerator();
+                       // Emit the IL for the set access. 
+                       if(targetField != null)
+                       {
+                               setIL.Emit(OpCodes.Ldarg_0);//Load the first 
argument (target object)
+                               setIL.Emit(OpCodes.Ldarg_1);//Load the second 
argument (value object)
+                               setIL.Emit(OpCodes.Stfld, targetField); //Set 
the field value
+                       }
+                       else
+                       {
+                               
setIL.ThrowException(typeof(MissingMethodException));
+                       }
+                       setIL.Emit(OpCodes.Ret);
+
+                       // Load the type
+                       typeBuilder.CreateType();
+               }
+
+               /// <summary>
+               /// Get the null value for a given type
+               /// </summary>
+               /// <param name="type"></param>
+               /// <returns></returns>
+               private object GetNullInternal(Type type)
+               {
+                       if (type.IsValueType)
+                       {
+                               if (type.IsEnum) 
+                               { 
+                                       return GetNullInternal(  
Enum.GetUnderlyingType(type) );
+                               }
+
+                               if (type.IsPrimitive)
+                               {
+                                       if (type == typeof(Int32)) {return 0; }
+                                       if (type == typeof(Double)) {return 
(Double)0; }
+                                       if (type == typeof(Int16)) {return 
(Int16)0; }
+                                       if (type == typeof(SByte)) {return 
(SByte)0; }
+                                       if (type == typeof(Int64)) {return 
(Int64)0; }
+                                       if (type == typeof(Byte)) {return 
(Byte)0; }
+                                       if (type == typeof(UInt16)) {return 
(UInt16)0; }
+                                       if (type == typeof(UInt32)) {return 
(UInt32)0; }
+                                       if (type == typeof(UInt64)) {return 
(UInt64)0; }
+                                       if (type == typeof(UInt64)) {return 
(UInt64)0; }
+                                       if (type == typeof(Single)) {return 
(Single)0; }
+                                       if (type == typeof(Boolean)) {return 
false; }
+                                       if (type == typeof(char)) {return '\0'; 
}
+                               }
+                               else
+                               {
+                                       if (type == typeof(DateTime)) {return 
DateTime.MinValue; }
+                                       if (type == typeof(Decimal)) {return 
0m; }
+                                       if (type == typeof(Guid)) {return 
Guid.Empty; }
+                                       if (type == typeof(TimeSpan)) { return 
TimeSpan.MinValue; }
+                               }
+                       }
+ 
+                       return null;
+               }
+
+
                #region IMemberAccessor Members
 
                /// <summary>
@@ -83,8 +251,7 @@
                /// <returns>Property value.</returns>
                public object Get(object target)
                {
-                       // TODO:  Add EmitFieldAccessor.Get implementation
-                       return null;
+                       return _emittedFieldAccessor.Get(target);
                }
 
                /// <summary>
@@ -94,9 +261,17 @@
                /// <param name="value">Value to set.</param>
                public void Set(object target, object value)
                {
-                       // TODO:  Add EmitFieldAccessor.Set implementation
+                       object newValue = value;
+                       if (newValue == null)
+                       {
+                               // If the value to assign is null, assign null 
internal value
+                               newValue = _nullInternal;
+                       }
+                       _emittedFieldAccessor.Set(target, newValue);
                }
 
                #endregion
        }
 }
+
+

Copied: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs
 (from r386699, 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ILPropertyAccessor.cs)
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs?p2=ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs&p1=ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ILPropertyAccessor.cs&r1=386699&r2=387044&rev=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ILPropertyAccessor.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyAccessor.cs
 Sun Mar 19 14:02:00 2006
@@ -28,7 +28,6 @@
 using System.Collections.Specialized;
 using System.Reflection;
 using System.Reflection.Emit;
-using IBatisNet.Common.Exceptions;
 
 namespace IBatisNet.Common.Utilities.Objects.Members
 {
@@ -45,9 +44,27 @@
                private AssemblyBuilder _assemblyBuilder = null;
                private ModuleBuilder _moduleBuilder = null;
         private object _nullInternal = null;
+               private bool _canRead = false;
+               private bool _canWrite = false;
 
                private static IDictionary _typeToOpcode = new 
HybridDictionary();
 
+               /// <summary>
+               /// Gets a value indicating whether the property can be read. 
+               /// </summary>
+               public bool CanRead
+               {
+                       get { return _canRead; }
+               }
+
+               /// <summary>
+               /// Gets a value indicating whether the property can be written 
to. 
+               /// </summary>
+               public bool CanWrite
+               {
+                       get { return _canWrite; }
+               }
+
         /// <summary>
         /// Static constructor
         /// "Initialize a private hashtable with type-opCode pairs 
@@ -78,28 +95,30 @@
         /// <param name="moduleBuilder"></param>
         public EmitPropertyAccessor(Type targetType, string propertyName, 
AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder)
                {
-                       this._assemblyBuilder = assemblyBuilder;
-                       this._moduleBuilder = moduleBuilder;
-                       this._targetType = targetType;
-            this._propertyName = propertyName;
+                       _assemblyBuilder = assemblyBuilder;
+                       _moduleBuilder = moduleBuilder;
+                       _targetType = targetType;
+            _propertyName = propertyName;
 
-            PropertyInfo propertyInfo = targetType.GetProperty(propertyName);
+                       PropertyInfo propertyInfo = 
targetType.GetProperty(propertyName);
 
                        // Make sure the property exists
                        if(propertyInfo == null)
                        {
-                               throw new ProbeException(
+                               throw new MissingMethodException(
                                        string.Format("Property \"{0}\" does 
not exist for type "
                     + "{1}.", propertyName, targetType));
                        }
                        else
                        {
-                               this._propertyType = propertyInfo.PropertyType;
-                this.Init();
+                               _propertyType = propertyInfo.PropertyType;
+                               _canRead = propertyInfo.CanRead;
+                               _canWrite = propertyInfo.CanWrite;
+                this.EmitIL();
                        }
                }
 
-
+               #region IMemberAccessor Members
                /// <summary>
                /// Gets the property value from the specified target.
                /// </summary>
@@ -107,9 +126,19 @@
                /// <returns>Property value.</returns>
                public object Get(object target)
                {
-                       return this._emittedPropertyAccessor.Get(target);
+                       if (_canRead)
+                       {
+                               return _emittedPropertyAccessor.Get(target);
+                       }
+                       else
+                       {
+                               throw new MissingMethodException(
+                                       string.Format("Property \"{0}\" on type 
"
+                                       + "{1} doesn't have a get method.", 
_propertyName, _targetType));
+                       }
                }
 
+
                /// <summary>
                /// Sets the property for the specified target.
                /// </summary>
@@ -117,16 +146,33 @@
                /// <param name="value">Value to set.</param>
                public void Set(object target, object value)
                {
-            // If the value to assign is null and assign null internal value
-            object newValue = value;
-            if (newValue == null)
-            {
-                newValue = _nullInternal;
-            }
+                       if (_canWrite)
+                       {
+                               object newValue = value;
+                               if (newValue == null)
+                               {
+                                       // If the value to assign is null, 
assign null internal value
+                                       newValue = _nullInternal;
+                               }
 
-            this._emittedPropertyAccessor.Set(target, newValue);
+                               _emittedPropertyAccessor.Set(target, newValue);
+                       }
+                       else
+                       {
+                               throw new MissingMethodException(
+                                       string.Format("Property \"{0}\" on type 
"
+                                       + "{1} doesn't have a set method.", 
_propertyName, _targetType));
+                       }
                }
 
+
+               #endregion
+
+               /// <summary>
+               /// Get the null value for a given type
+               /// </summary>
+               /// <param name="type"></param>
+               /// <returns></returns>
         private object GetNullInternal(Type type)
         {
             if (type.IsValueType)
@@ -164,40 +210,44 @@
             return null;
         }
 
+
                /// <summary>
-               /// This method generates creates a new assembly containing
-               /// the Type that will provide dynamic access.
+               /// This method a new type oject for the the property accessor 
class 
+               /// that will provide dynamic access.
                /// </summary>
-               private void Init()
+               private void EmitIL()
                {
-                       // Create the assembly and an instance of the property 
accessor class.
+                       // Create a new type oject for the the property 
accessor class.
             EmitType();
 
+                       // Create a new instance
             _emittedPropertyAccessor = 
_assemblyBuilder.CreateInstance("PropertyAccessorFor" + _targetType.FullName + 
_propertyName) as IMemberAccessor;
             
             _nullInternal = GetNullInternal(_propertyType);
 
                        if(_emittedPropertyAccessor == null)
                        {
-                throw new ProbeException(string.Format("Unable to create 
property accessor for \"{0}\".", _propertyName));
+                throw new MethodAccessException(
+                                       string.Format("Unable to create 
property accessor for \"{0}\".", _propertyName));
                        }
                }
 
+               
                /// <summary>
-               /// Create an assembly that will provide the get and set 
methods.
+               /// Create an type that will provide the get and set access 
method.
                /// </summary>
                private void EmitType()
                {
-                       //  Define a public class named "Property..." in the 
assembly.
-            TypeBuilder typeBuilder = 
_moduleBuilder.DefineType("PropertyAccessorFor" + _targetType.FullName + 
_propertyName, TypeAttributes.Public);
+                       // Define a public class named 
"PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly.
+            TypeBuilder typeBuilder = 
_moduleBuilder.DefineType("PropertyAccessorFor" + _targetType.FullName + 
_propertyName, TypeAttributes.Class | TypeAttributes.Public | 
TypeAttributes.Sealed);
 
-                       // Mark the class as implementing IPropertyAccessor. 
+                       // Mark the class as implementing IMemberAccessor. 
                        
typeBuilder.AddInterfaceImplementation(typeof(IMemberAccessor));
 
                        // Add a constructor
                        
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
 
-                       // Define a method for the get operation. 
+                       // Define a method named "Get" for the get operation 
(IMemberAccessor). 
                        Type[] getParamTypes = new Type[] {typeof(object)};
                        MethodBuilder getMethod = 
                                typeBuilder.DefineMethod("Get", 
@@ -205,37 +255,33 @@
                 typeof(object), 
                                getParamTypes);
 
-                       // From the method, get an ILGenerator. This is used to
-                       // emit the IL that we want.
+                       // Get an ILGenerator and used it to emit the IL that 
we want.
                        ILGenerator getIL = getMethod.GetILGenerator();
 
-                       // Emit the IL. 
-                       MethodInfo targetGetMethod = 
this._targetType.GetMethod("get_" + this._propertyName);
+                       // Emit the IL for get access. 
+                       MethodInfo targetGetMethod = 
_targetType.GetMethod("get_" + _propertyName);
 
                        if(targetGetMethod != null)
                        {
                                getIL.DeclareLocal(typeof(object));
                                getIL.Emit(OpCodes.Ldarg_1);    //Load the 
first argument,(target object)
-                               getIL.Emit(OpCodes.Castclass, 
this._targetType);        //Cast to the source type
-                               getIL.EmitCall(OpCodes.Call, targetGetMethod, 
null);    //Get the property value
-
+                               getIL.Emit(OpCodes.Castclass, _targetType);     
//Cast to the source type
+                               getIL.EmitCall(OpCodes.Call, targetGetMethod, 
null); //Get the property value
                                if(targetGetMethod.ReturnType.IsValueType)
                                {
-                                       getIL.Emit(OpCodes.Box, 
targetGetMethod.ReturnType);    //Box if necessary
+                                       getIL.Emit(OpCodes.Box, 
targetGetMethod.ReturnType); //Box if necessary
                                }
-                               getIL.Emit(OpCodes.Stloc_0);                    
                                        //Store it
-                       
+                               getIL.Emit(OpCodes.Stloc_0); //Store it
                                getIL.Emit(OpCodes.Ldloc_0);
                        }
                        else
                        {
                                
getIL.ThrowException(typeof(MissingMethodException));
                        }
-
                        getIL.Emit(OpCodes.Ret);
 
 
-                       // Define a method for the set operation.
+                       // Define a method named "Set" for the set operation 
(IMemberAccessor).
                        Type[] setParamTypes = new Type[] {typeof(object), 
typeof(object)};
                        MethodBuilder setMethod = 
                                typeBuilder.DefineMethod("Set", 
@@ -243,29 +289,24 @@
                                null, 
                                setParamTypes);
 
-                       // From the method, get an ILGenerator. This is used to
-                       // emit the IL that we want.
+                       // Get an ILGenerator and  used to emit the IL that we 
want.
                        ILGenerator setIL = setMethod.GetILGenerator();
-                       // Emit the IL. 
-                       MethodInfo targetSetMethod = 
this._targetType.GetMethod("set_" + this._propertyName);
+                       // Emit the IL for the set access. 
+                       MethodInfo targetSetMethod = 
_targetType.GetMethod("set_" + _propertyName);
                        if(targetSetMethod != null)
                        {
                                Type paramType = 
targetSetMethod.GetParameters()[0].ParameterType;
-
                                setIL.DeclareLocal(paramType);
-                               setIL.Emit(OpCodes.Ldarg_1);                    
                        //Load the first argument 
-                                                                               
                                                        //(target object)
-                               setIL.Emit(OpCodes.Castclass, 
this._targetType);        //Cast to the source type
-
-                               setIL.Emit(OpCodes.Ldarg_2);                    
                        //Load the second argument 
-                                                                               
                                                        //(value object)
+                               setIL.Emit(OpCodes.Ldarg_1); //Load the first 
argument (target object)
+                               setIL.Emit(OpCodes.Castclass, _targetType); 
//Cast to the source type
+                               setIL.Emit(OpCodes.Ldarg_2); //Load the second 
argument (value object)
                                if(paramType.IsValueType)
                                {
-                                       setIL.Emit(OpCodes.Unbox, paramType);   
                //Unbox it      
-                                       if(_typeToOpcode[paramType]!=null)      
                                //and load
+                                       setIL.Emit(OpCodes.Unbox, paramType); 
//Unbox it        
+                                       if(_typeToOpcode[paramType]!=null)      
                                
                                        {
                                                OpCode load = 
(OpCode)_typeToOpcode[paramType];
-                                               setIL.Emit(load);
+                                               setIL.Emit(load); //and load
                                        }
                                        else
                                        {
@@ -274,11 +315,9 @@
                                }
                                else
                                {
-                                       setIL.Emit(OpCodes.Castclass, 
paramType);               //Cast class
+                                       setIL.Emit(OpCodes.Castclass, 
paramType); //Cast class
                                }
-                       
-                               setIL.EmitCall(OpCodes.Callvirt, 
-                                       targetSetMethod, null);                 
                                //Set the property value
+                               setIL.EmitCall(OpCodes.Callvirt, 
targetSetMethod, null); //Set the property value
                        }
                        else
                        {
@@ -289,5 +328,6 @@
                        // Load the type
                        typeBuilder.CreateType();
                }
+
        }
 }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs
 Sun Mar 19 14:02:00 2006
@@ -75,7 +75,7 @@
                                else
                                {
                                        _createPropertyAccessor = new 
CreateMemberPropertyAccessor(CreateEmitPropertyAccessor);
-                                       _createFieldAccessor = new 
CreateMemberFieldAccessor(CreateEmitFieldAccessor);
+                                       _createFieldAccessor = new 
CreateMemberFieldAccessor(CreateReflectionFieldAccessor);//CreateEmitFieldAccessor
                                }
                        }
                        else
@@ -118,7 +118,7 @@
                                                else 
                                                {
                                                        // Field
-                                                       FieldInfo fieldInfo = 
targetType.GetField(name);
+                                                       FieldInfo fieldInfo = 
targetType.GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | 
BindingFlags.Public);
 
                                                        if (fieldInfo!=null)
                                                        {

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldAccessor.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldAccessor.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldAccessor.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldAccessor.cs
 Sun Mar 19 14:02:00 2006
@@ -24,6 +24,7 @@
 #endregion
 
 using System;
+using System.Reflection;
 
 namespace IBatisNet.Common.Utilities.Objects.Members
 {
@@ -33,6 +34,8 @@
        /// </summary>
        public class ReflectionFieldAccessor : IMemberAccessor
        {
+               private FieldInfo _fieldInfo = null;
+
                /// <summary>
                /// Creates a new Reflection field accessor.
                /// </summary>
@@ -40,9 +43,7 @@
                /// <param name="fieldName">Field name.</param>
                public ReflectionFieldAccessor(Type targetType, string 
fieldName)
                {
-                       //
-                       // TODO: Add constructor logic here
-                       //
+                       _fieldInfo = targetType.GetField(fieldName, 
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
                }
 
                #region IMemberAccessor Members
@@ -55,8 +56,7 @@
                /// <returns>Property value.</returns>
                public object Get(object target)
                {
-                       // TODO:  Add ReflectionFieldAccessor.Get implementation
-                       return null;
+                       return _fieldInfo.GetValue(target);
                }
 
                /// <summary>
@@ -67,7 +67,7 @@
                /// <param name="value">Property value.</param>
                public void Set(object target, object value)
                {
-                       // TODO:  Add ReflectionFieldAccessor.Set implementation
+                       _fieldInfo.SetValue(target, value);
                }
 
                #endregion

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyAccessor.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyAccessor.cs?rev=387044&r1=387043&r2=387044&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyAccessor.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyAccessor.cs
 Sun Mar 19 14:02:00 2006
@@ -24,6 +24,7 @@
 #endregion
 
 using System;
+using System.Reflection;
 
 namespace IBatisNet.Common.Utilities.Objects.Members
 {
@@ -33,6 +34,14 @@
     /// </summary>
     public class ReflectionPropertyAccessor : IMemberAccessor
     {
+//             private static BindingFlags BINDING_FLAGS
+//                     = BindingFlags.Public 
+//                     | BindingFlags.Instance 
+//                     ;
+
+               private PropertyInfo _propertyInfo = null;
+               private string _propertyName = string.Empty;
+               private Type _targetType = null;
 
                /// <summary>
                /// Creates a new Reflection property accessor.
@@ -41,6 +50,10 @@
                /// <param name="propertyName">Property name.</param>
                public ReflectionPropertyAccessor(Type targetType, string 
propertyName)
                {
+                       _propertyInfo = 
ObjectProbe.GetPropertyInfoForSetter(targetType, propertyName);
+                               //targetType.GetProperty(propertyName, 
BINDING_FLAGS);
+                       _targetType = targetType;
+                       _propertyName = propertyName;
                }
 
                #region IMemberAccessor Members
@@ -52,8 +65,17 @@
         /// <returns>Property value.</returns>
         public object Get(object target)
         {
-            return null;
-        }
+                       if (_propertyInfo.CanRead)
+                       {
+                               return _propertyInfo.GetValue(target, null);
+                       }
+                       else
+                       {
+                               throw new MissingMethodException(
+                                       string.Format("Property \"{0}\" on type 
"
+                                       + "{1} doesn't have a get method.", 
_propertyName, _targetType));
+                       }        
+               }
 
         /// <summary>
         /// Sets the value for the property of
@@ -63,6 +85,16 @@
         /// <param name="value">Property value.</param>
         public void Set(object target, object value)
         {
+                       if (_propertyInfo.CanWrite)
+                       {
+                               _propertyInfo.SetValue(target, value, null);
+                       }
+                       else
+                       {
+                               throw new MissingMethodException(
+                                       string.Format("Property \"{0}\" on type 
"
+                                       + "{1} doesn't have a set method.", 
_propertyName, _targetType));
+                       }
         }
                #endregion
     }


Reply via email to