Uploaded image for project: 'S2Dao.NET'
  1. S2Dao.NET
  2. DAONET-78

検索(select文)を実行したときの戻り値でユーザ定義型を使えるようにする。

XMLWordPrintable

    • Type: Icon: New Feature New Feature
    • Resolution: Fixed
    • Priority: Icon: Major Major
    • 1.3.11
    • Affects Version/s: 1.3.9
    • Component/s: S2Dao.NET
    • None

      検索(select文)を実行したときの戻り値に
      .NET 3.0から追加された System.Collections.ObjectModel.ObservableCollection<T> や
      System.Collections.CollectionBase を拡張したクラスを
      ユーザが独自に指定できるようにする。

      例:System.Collections.ObjectModel.Collection<T> に対応する
      – Dao.dicon
      <components namespace="Dao">
      <include path="Ado.dicon"/>
      <component class="Seasar.Dao.Impl.FieldAnnotationReaderFactory" />
      <component class="Seasar.Dao.Impl.DaoMetaDataFactoryImpl" />
      <!-- System.Collections.ObjectModel.Collection<T> に対応したハンドラ -->
      <component class="S2DaoNetTest.Dao.GenericCollectionDataReaderHandlerFactory" />
      <component name="Interceptor" class="Seasar.Dao.Interceptors.S2DaoInterceptor" />
      </components>

      – ソース
      public class GenericCollectionDataReaderHandlerFactory : DataReaderHandlerFactory
      {
      public override IDataReaderHandler GetResultSetHandler(Type beanType, IBeanMetaData bmd, MethodInfo mi)
      {
      Type retType = mi.ReturnType;
      if (retType.IsGenericType && retType.GetGenericTypeDefinition().Equals(typeof(Collection<>)))
      {
      Type elementType = retType.GetGenericArguments()[0];
      if (AssignTypeUtil.IsSimpleType(elementType))

      { return new ObjectGenericCollectionDataReaderHandler(retType); }

      else

      { return new BeanGenericCollectionMetaDataDataReaderHandler(bmd, CreateRowCreator(), CreateRelationRowCreator()); ; }

      }
      return base.GetResultSetHandler(beanType, bmd, mi);
      }
      }

      public class BeanGenericCollectionMetaDataDataReaderHandler
      : BeanListMetaDataDataReaderHandler
      {
      public BeanGenericCollectionMetaDataDataReaderHandler(
      IBeanMetaData beanMetaData, IRowCreator rowCreator, IRelationRowCreator relationRowCreator)
      : base(beanMetaData, rowCreator, relationRowCreator)
      {
      }

      public override object Handle(IDataReader dataReader)

      { Type generic = typeof(Collection<>); Type constructed = generic.MakeGenericType(BeanMetaData.BeanType); object list = Activator.CreateInstance(constructed); Handle(dataReader, (IList) list); return list; }

      }

            Assignee:
            rmiyax rmiyax
            Reporter:
            rmiyax rmiyax
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: