#region Apache Notice /***************************************************************************** * $Revision: 450157 $ * $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 #region Using using System; using System.Collections.Specialized; using System.Data; using System.Xml.Serialization; using Apache.Ibatis.Common.Utilities.Objects; using Apache.Ibatis.DataMapper.DataExchange; using Apache.Ibatis.Common.Utilities; #endregion namespace Apache.Ibatis.DataMapper.Configuration.ResultMapping { /// /// Implementation of interface for auto mapping /// public class AutoResultMap : IResultMap { [NonSerialized] private bool _isInitalized = false; [NonSerialized] private Type _resultClass = null; [NonSerialized] private IFactory _resultClassFactory = null; [NonSerialized] private ResultPropertyCollection _properties = new ResultPropertyCollection(); [NonSerialized] private IDataExchange _dataExchange = null; /// /// Initializes a new instance of the class. /// /// The result class. /// The result class factory. /// The data exchange. public AutoResultMap(Type resultClass, IFactory resultClassFactory, IDataExchange dataExchange) { _resultClass = resultClass; _resultClassFactory = resultClassFactory; _dataExchange = dataExchange; } #region IResultMap Members /// /// The GroupBy Properties. /// [XmlIgnore] public StringCollection GroupByPropertyNames { get { throw new NotImplementedException("The property 'GroupByPropertyNames' is not implemented."); } } /// /// The collection of ResultProperty. /// [XmlIgnore] public ResultPropertyCollection Properties { get { return _properties; } } /// /// The GroupBy Properties. /// /// public ResultPropertyCollection GroupByProperties { get { throw new NotImplementedException("The property 'GroupByProperties' is not implemented."); } } /// /// The collection of constructor parameters. /// [XmlIgnore] public ResultPropertyCollection Parameters { get { throw new NotImplementedException("The property 'Parameters' is not implemented."); } } /// /// Gets or sets a value indicating whether this instance is initalized. /// /// /// true if this instance is initalized; otherwise, false. /// public bool IsInitalized { get { return _isInitalized; } set { _isInitalized = value; } } /// /// Identifier used to identify the resultMap amongst the others. /// /// /// GetProduct public string Id { get { return _resultClass.Name; } } /// /// The output type class of the resultMap. /// /// public Type Class { get { return _resultClass; } } /// /// Sets the IDataExchange /// /// public IDataExchange DataExchange { set { _dataExchange = value; } } /// /// Create an instance Of result. /// /// An array of values that matches the number, order and type /// of the parameters for this constructor. /// An object. public object CreateInstanceOfResult(object[] parameters) { return CreateInstanceOfResultClass(); } /// /// Set the value of an object property. /// /// The object to set the property. /// The result property to use. /// The database value to set. public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) { _dataExchange.SetData(ref target, property, dataBaseValue); } /// /// /// /// public IResultMap ResolveSubMap(IDataReader dataReader) { return this; } #endregion /// /// Clones this instance. /// /// public AutoResultMap Clone() { return new AutoResultMap(_resultClass, _resultClassFactory, _dataExchange); } /// /// Create an instance of result class. /// /// An object. public object CreateInstanceOfResultClass() { if (_resultClass.IsPrimitive || _resultClass == typeof(string)) { TypeCode typeCode = Type.GetTypeCode(_resultClass); return TypeUtils.InstantiatePrimitiveType(typeCode); } else { if (_resultClass.IsValueType) { if (_resultClass == typeof(DateTime)) { return new DateTime(); } else if (_resultClass == typeof(Decimal)) { return new Decimal(); } else if (_resultClass == typeof(Guid)) { return Guid.Empty; } else if (_resultClass == typeof(TimeSpan)) { return new TimeSpan(0); } else if (_resultClass.IsGenericType && typeof(Nullable<>).IsAssignableFrom(_resultClass.GetGenericTypeDefinition())) { return TypeUtils.InstantiateNullableType(_resultClass); } else { throw new NotImplementedException("Unable to instanciate value type"); } } else { return _resultClassFactory.CreateInstance(null); } } } } }