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. |