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/03/15 23:05:47 UTC
svn commit: r386179 - in /ibatis/trunk/cs/mapper: IBatisNet.Common.Test/
IBatisNet.Common.Test/Domain/
IBatisNet.Common.Test/NUnit/CommonTests/Utilities/
IBatisNet.Common/Utilities/Objects/
Author: gbayon
Date: Wed Mar 15 14:05:46 2006
New Revision: 386179
URL: http://svn.apache.org/viewcvs?rev=386179&view=rev
Log:
- Added Enum support in ILPropertyAccessor
Added:
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs (with props)
Modified:
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.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=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs Wed Mar 15 14:05:46 2006
@@ -2,6 +2,17 @@
namespace IBatisNet.Common.Test.Domain
{
+ public enum Days
+ {
+ Sat = 1,
+ Sun,
+ Mon,
+ Tue,
+ Wed,
+ Thu,
+ Fri
+ };
+
/// <summary>
/// Summary description for Property.
/// </summary>
@@ -25,6 +36,7 @@
private Guid _guid = Guid.Empty;
private TimeSpan _timeSpan = TimeSpan.MinValue;
private Account _account = null;
+ private Days _day;
#if dotnet2
private Int32? _intNullable = null;
@@ -35,6 +47,12 @@
set { _intNullable = value; }
}
#endif
+
+ public Days Day
+ {
+ get { return _day; }
+ set { _day = value; }
+ }
public string String
{
Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj?rev=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj Wed Mar 15 14:05:46 2006
@@ -133,6 +133,7 @@
<SubType>Code</SubType>
</Compile>
<Compile Include="NUnit\CommonTests\Utilities\ObjectFactoryTest.cs" />
+ <Compile Include="NUnit\CommonTests\Utilities\PropertyAccessorPerformance.cs" />
<Compile Include="NUnit\CommonTests\Utilities\PropertyAccessorTest.cs" />
<Compile Include="NUnit\CommonTests\Utilities\ResourcesTest.cs">
<SubType>Code</SubType>
Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj?rev=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj Wed Mar 15 14:05:46 2006
@@ -300,6 +300,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "NUnit\CommonTests\Utilities\PropertyAccessorPerformance.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "NUnit\CommonTests\Utilities\PropertyAccessorTest.cs"
SubType = "Code"
BuildAction = "Compile"
Added: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs?rev=386179&view=auto
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs (added)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs Wed Mar 15 14:05:46 2006
@@ -0,0 +1,240 @@
+using System;
+using System.Reflection;
+using IBatisNet.Common.Test.Domain;
+using IBatisNet.Common.Utilities;
+using IBatisNet.Common.Utilities.Objects;
+using NUnit.Framework;
+
+
+namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities
+{
+ [TestFixture]
+ public class PropertyAccessorPerformance
+ {
+ #region SetUp & TearDown
+
+ /// <summary>
+ /// SetUp
+ /// </summary>
+ [SetUp]
+ public void SetUp()
+ {
+ }
+
+
+ /// <summary>
+ /// TearDown
+ /// </summary>
+ [TearDown]
+ public void Dispose()
+ {
+ }
+
+ #endregion
+
+ /// <summary>
+ /// Test integer property access performance
+ /// </summary>
+ [Test]
+ public void TestGetIntegerPerformance()
+ {
+ const int TEST_ITERATIONS = 1000000;
+ Property prop = new Property();
+ int test = -1;
+ Timer timer = new Timer();
+
+ #region Direct access (fastest)
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ test = -1;
+ test = prop.Int;
+ Assert.AreEqual(int.MinValue, test);
+ }
+ timer.Stop();
+ double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ #endregion
+
+ #region IL Property accessor
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+ IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ test = -1;
+ test = (int)propertyAccessor.Get(prop);
+ Assert.AreEqual(int.MinValue, test);
+ }
+ timer.Stop();
+ double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration;
+ #endregion
+
+ #region IBatisNet.Common.Utilities.Object.ReflectionInfo
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(prop.GetType());
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ test = -1;
+ PropertyInfo propertyInfo = reflectionInfo.GetGetter("Int");
+ test = (int)propertyInfo.GetValue(prop, null);
+ Assert.AreEqual(int.MinValue, test);
+ }
+ timer.Stop();
+ double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionInfoRatio = (float)reflectionInfoDuration / directAccessDuration;
+ #endregion
+
+ #region Reflection
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Type type = prop.GetType();
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ test = -1;
+ PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+ test = (int)propertyInfo.GetValue(prop, null);
+ Assert.AreEqual(int.MinValue, test);
+ }
+ timer.Stop();
+ double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionRatio = reflectionDuration / directAccessDuration;
+ #endregion
+
+ #region ReflectionInvokeMember (slowest)
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ test = -1;
+ test = (int)type.InvokeMember("Int",
+ BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance,
+ null, prop, null);
+ Assert.AreEqual(int.MinValue, test);
+ }
+ timer.Stop();
+ double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration;
+ #endregion
+
+ // Print results
+ Console.WriteLine("{0} property gets on integer...", TEST_ITERATIONS);
+ Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3"));
+ Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3"));
+ Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3"));
+ Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3"));
+ Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
+ }
+
+
+ /// <summary>
+ /// Test the performance of getting an integer property.
+ /// </summary>
+ [Test]
+ public void TestSetIntegerPerformance()
+ {
+ const int TEST_ITERATIONS = 1000000;
+ Property prop = new Property();
+ int value = 123;
+ Timer timer = new Timer();
+
+ #region Direct access (fastest)
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ prop.Int = value;
+ }
+ timer.Stop();
+ double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ #endregion
+
+ #region Property accessor
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+ IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ propertyAccessor.Set(prop, value);
+ }
+ timer.Stop();
+ double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration;
+ #endregion
+
+ #region IBatisNet.Common.Utilities.Object.ReflectionInfo
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ Type type = prop.GetType();
+ ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(type);
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ PropertyInfo propertyInfo = reflectionInfo.GetSetter("Int");
+ propertyInfo.SetValue(prop, value, null);
+ }
+ timer.Stop();
+ double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionInfoRatio = reflectionInfoDuration / directAccessDuration;
+ #endregion
+
+ #region Reflection
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+ propertyInfo.SetValue(prop, value, null);
+ }
+ timer.Stop();
+ double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionRatio = reflectionDuration / directAccessDuration;
+ #endregion
+
+ #region ReflectionInvokeMember (slowest)
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ timer.Start();
+ for (int i = 0; i < TEST_ITERATIONS; i++)
+ {
+ type.InvokeMember("Int",
+ BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance,
+ null, prop, new object[] { value });
+ }
+ timer.Stop();
+ double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
+ double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration;
+ #endregion
+
+ // Print results
+ Console.WriteLine("{0} property sets on integer...", TEST_ITERATIONS);
+ Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3"));
+ Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3"));
+ Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3"));
+ Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3"));
+ Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
+ }
+ }
+}
Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs
------------------------------------------------------------------------------
svn:keywords = Id LastChangedDate LastChangedBy
Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs?rev=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs Wed Mar 15 14:05:46 2006
@@ -61,210 +61,6 @@
Assert.AreEqual(int.MinValue, propertyAccessor2.Get(prop));
}
- /// <summary>
- /// Test integer property access performance
- /// </summary>
- [Test]
- public void TestGetIntegerPerformance()
- {
- const int TEST_ITERATIONS = 1000000;
- Property prop = new Property();
- int test = -1;
- Timer timer = new Timer();
-
- #region Direct access (fastest)
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- test = -1;
- test = prop.Int;
- Assert.AreEqual(int.MinValue, test);
- }
- timer.Stop();
- double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- #endregion
-
- #region IL Property accessor
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
- IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- test = -1;
- test = (int)propertyAccessor.Get(prop);
- Assert.AreEqual(int.MinValue, test);
- }
- timer.Stop();
- double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration;
- #endregion
-
- #region IBatisNet.Common.Utilities.Object.ReflectionInfo
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(prop.GetType());
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- test = -1;
- PropertyInfo propertyInfo = reflectionInfo.GetGetter("Int");
- test = (int)propertyInfo.GetValue(prop, null);
- Assert.AreEqual(int.MinValue, test);
- }
- timer.Stop();
- double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionInfoRatio = (float)reflectionInfoDuration / directAccessDuration;
- #endregion
-
- #region Reflection
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- Type type = prop.GetType();
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- test = -1;
- PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
- test = (int)propertyInfo.GetValue(prop, null);
- Assert.AreEqual(int.MinValue, test);
- }
- timer.Stop();
- double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionRatio = reflectionDuration / directAccessDuration;
- #endregion
-
- #region ReflectionInvokeMember (slowest)
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- test = -1;
- test = (int)type.InvokeMember("Int",
- BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance,
- null, prop, null);
- Assert.AreEqual(int.MinValue, test);
- }
- timer.Stop();
- double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration;
- #endregion
-
- // Print results
- Console.WriteLine("{0} property gets on integer...", TEST_ITERATIONS);
- Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3"));
- Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3"));
- Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3"));
- Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3"));
- Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
- }
-
-
- /// <summary>
- /// Test the performance of getting an integer property.
- /// </summary>
- [Test]
- public void TestSetIntegerPerformance()
- {
- const int TEST_ITERATIONS = 1000000;
- Property prop = new Property();
- int value = 123;
- Timer timer = new Timer();
-
- #region Direct access (fastest)
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- prop.Int = value;
- }
- timer.Stop();
- double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- #endregion
-
- #region Property accessor
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
- IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- propertyAccessor.Set(prop, value);
- }
- timer.Stop();
- double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration;
- #endregion
-
- #region IBatisNet.Common.Utilities.Object.ReflectionInfo
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- Type type = prop.GetType();
- ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(type);
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- PropertyInfo propertyInfo = reflectionInfo.GetSetter("Int");
- propertyInfo.SetValue(prop, value, null);
- }
- timer.Stop();
- double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionInfoRatio = reflectionInfoDuration / directAccessDuration;
- #endregion
-
- #region Reflection
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
- propertyInfo.SetValue(prop, value, null);
- }
- timer.Stop();
- double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionRatio = reflectionDuration / directAccessDuration;
- #endregion
-
- #region ReflectionInvokeMember (slowest)
- GC.Collect();
- GC.WaitForPendingFinalizers();
-
- timer.Start();
- for (int i = 0; i < TEST_ITERATIONS; i++)
- {
- type.InvokeMember("Int",
- BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance,
- null, prop, new object[] { value });
- }
- timer.Stop();
- double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
- double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration;
- #endregion
-
- // Print results
- Console.WriteLine("{0} property sets on integer...", TEST_ITERATIONS);
- Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3"));
- Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3"));
- Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3"));
- Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3"));
- Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
- }
/// <summary>
@@ -1178,6 +974,59 @@
Assert.AreEqual(test.FirstName, prop.Account.FirstName);
}
+
+ /// <summary>
+ /// Test the setting null on a Enum property.
+ /// </summary>
+ [Test]
+ public void TestSetNullOnEnumProperty()
+ {
+ Property prop = new Property();
+ prop.Day = Days.Thu;
+
+ PropertyInfo propertyInfo = typeof(Property).GetProperty("Day", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+ propertyInfo.SetValue(prop, null, null);
+
+ // Property accessor
+ PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+ IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Day");
+ propertyAccessor.Set(prop, null);
+ //Assert.AreEqual(TimeSpan.MinValue, prop.TimeSpan);
+ }
+
+ /// <summary>
+ /// Test setting an Enum property.
+ /// </summary>
+ [Test]
+ public void TestSetEnum()
+ {
+ Property prop = new Property();
+ prop.Day = Days.Thu;
+
+ // Property accessor
+ PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+ IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Day");
+ Days test = Days.Wed;
+ propertyAccessor.Set(prop, test);
+ Assert.AreEqual(test, prop.Day);
+ }
+
+ /// <summary>
+ /// Test getting an Enum property.
+ /// </summary>
+ [Test]
+ public void TestGetEnum()
+ {
+ Days test = Days.Wed;
+ Property prop = new Property();
+ prop.Day = test;
+
+ // Property accessor
+ PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+ IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Day");
+ Assert.AreEqual(test, propertyAccessor.Get(prop));
+ }
+
#if dotnet2
/// <summary>
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=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs Wed Mar 15 14:05:46 2006
@@ -43,7 +43,7 @@
public FactoryBuilder()
{
AssemblyName assemblyName = new AssemblyName();
- assemblyName.Name = "iBATIS.EmitFactory";
+ assemblyName.Name = "iBATIS.EmitFactory" + HashCodeProvider.GetIdentityHashCode(this).ToString();
// Create a new assembly with one module
AssemblyBuilder _assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs?rev=386179&r1=386178&r2=386179&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs Wed Mar 15 14:05:46 2006
@@ -44,9 +44,9 @@
private IPropertyAccessor _emittedPropertyAccessor = null;
private AssemblyBuilder _assemblyBuilder = null;
private ModuleBuilder _moduleBuilder = null;
+ private object _nullInternal = null;
private static IDictionary _typeToOpcode = new HybridDictionary();
- private static IDictionary _defaultValueType = new HybridDictionary();
/// <summary>
/// Static constructor
@@ -54,23 +54,6 @@
/// </summary>
static ILPropertyAccessor()
{
- _defaultValueType[typeof(sbyte)] = (sbyte)0;
- _defaultValueType[typeof(byte)] = (byte)0;
- _defaultValueType[typeof(char)] = '\0';
- _defaultValueType[typeof(short)] = (short)0;
- _defaultValueType[typeof(ushort)] = (ushort)0;
- _defaultValueType[typeof(int)] = 0;
- _defaultValueType[typeof(uint)] = (uint)0;
- _defaultValueType[typeof(long)] = 0L;
- _defaultValueType[typeof(ulong)] = (ulong)0;
- _defaultValueType[typeof(bool)] = false;
- _defaultValueType[typeof(double)] = 0.0D;
- _defaultValueType[typeof(float)] = 0.0F;
- _defaultValueType[typeof(decimal)] = 0.0M;
- _defaultValueType[typeof(DateTime)] = DateTime.MinValue;
- _defaultValueType[typeof(Guid)] = Guid.Empty;
- _defaultValueType[typeof(TimeSpan)] = TimeSpan.MinValue;
-
_typeToOpcode[typeof(sbyte)] = OpCodes.Ldind_I1;
_typeToOpcode[typeof(byte)] = OpCodes.Ldind_U1;
_typeToOpcode[typeof(char)] = OpCodes.Ldind_U2;
@@ -134,17 +117,49 @@
/// <param name="value">Value to set.</param>
public void Set(object target, object value)
{
- // If the value to assign is null and this property
- // accessor is for a value type, use a default value instead
+ // If the value to assign is null and assign null internal value
object newValue = value;
- if (newValue == null && _propertyType.IsValueType)
+ if (newValue == null)
{
- newValue = _defaultValueType[_propertyType];
+ newValue = _nullInternal;
}
this._emittedPropertyAccessor.Set(target, newValue);
}
+ private object GetNullInternal(Type type)
+ {
+ if (type.IsValueType)
+ {
+ if (type.IsEnum) { return 0; }
+
+ 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;
+ }
/// <summary>
/// This method generates creates a new assembly containing
@@ -156,6 +171,8 @@
EmitType();
_emittedPropertyAccessor = _assemblyBuilder.CreateInstance("PropertyAccessorFor" + _targetType.FullName + _propertyName) as IPropertyAccessor;
+
+ _nullInternal = GetNullInternal(_propertyType);
if(_emittedPropertyAccessor == null)
{