|
From: <fab...@us...> - 2009-03-14 05:09:49
|
Revision: 4129
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4129&view=rev
Author: fabiomaulo
Date: 2009-03-14 05:09:48 +0000 (Sat, 14 Mar 2009)
Log Message:
-----------
Fix NH-1704
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-03-14 04:36:00 UTC (rev 4128)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-03-14 05:09:48 UTC (rev 4129)
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using System.Reflection;
using NHibernate.Properties;
namespace NHibernate.Transform
@@ -26,22 +27,32 @@
[Serializable]
public class AliasToBeanResultTransformer : IResultTransformer
{
+ private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
private readonly System.Type resultClass;
private ISetter[] setters;
- private IPropertyAccessor propertyAccessor;
+ private readonly IPropertyAccessor propertyAccessor;
+ private readonly ConstructorInfo constructor;
public AliasToBeanResultTransformer(System.Type resultClass)
{
if (resultClass == null)
+ {
throw new ArgumentNullException("resultClass");
+ }
this.resultClass = resultClass;
- propertyAccessor = new ChainedPropertyAccessor(
- new IPropertyAccessor[]
- {
- // TODO H3: PropertyAccessorFactory.GetPropertyAccessor(resultClass, null),
- PropertyAccessorFactory.GetPropertyAccessor(null),
- PropertyAccessorFactory.GetPropertyAccessor("field")
- });
+ constructor = resultClass.GetConstructor(flags, null, System.Type.EmptyTypes, null);
+ if (constructor == null)
+ {
+ throw new ArgumentException("The target class of a AliasToBeanResultTransformer need a parameter-less constructor",
+ "resultClass");
+ }
+
+ propertyAccessor =
+ new ChainedPropertyAccessor(new[]
+ {
+ PropertyAccessorFactory.GetPropertyAccessor(null),
+ PropertyAccessorFactory.GetPropertyAccessor("field")
+ });
}
public object TransformTuple(object[] tuple, String[] aliases)
@@ -62,7 +73,7 @@
}
}
}
- result = Activator.CreateInstance(resultClass, true);
+ result = constructor.Invoke(null);
for (int i = 0; i < aliases.Length; i++)
{
Modified: trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-03-14 04:36:00 UTC (rev 4128)
+++ trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-03-14 05:09:48 UTC (rev 4129)
@@ -25,6 +25,17 @@
}
}
+ public class PublicParameterLessCtor
+ {
+ private string something;
+
+ public string Something
+ {
+ get { return something; }
+ set { something = value; }
+ }
+ }
+
#region Overrides of TestCase
protected override IList Mappings
@@ -56,6 +67,32 @@
Cleanup();
}
+ [Test]
+ public void WorkWithPublicParameterLessCtor()
+ {
+ Setup();
+
+ var queryString = "select s.Name as something from Simple s";
+ AssertAreWorking(queryString); // working for field access
+
+ queryString = "select s.Name as Something from Simple s";
+ AssertAreWorking(queryString); // working for property access
+
+ Cleanup();
+ }
+
+ private void AssertAreWorking(string queryString)
+ {
+ using (ISession s = OpenSession())
+ {
+ IList<PublicParameterLessCtor> l =
+ s.CreateSQLQuery(queryString).SetResultTransformer(
+ Transformers.AliasToBean<PublicParameterLessCtor>()).List<PublicParameterLessCtor>();
+ Assert.That(l.Count, Is.EqualTo(2));
+ Assert.That(l, Has.All.Not.Null);
+ }
+ }
+
private void Cleanup()
{
using (ISession s = OpenSession())
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|