検索(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))
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; }}