Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.ComponentModel.TypedListImpl.cs

 
using System;
using System.ComponentModel;

using BLToolkit.Reflection;

namespace BLToolkit.ComponentModel
{
    public class TypedListImpl : ITypedList
    {
        public TypedListImpl(Type itemType)
        {
            if (itemType == null) throw new ArgumentNullException("itemType");

            _itemType     = itemType;
            _typeAccessor = TypeAccessor.GetAccessor(itemType);
        }

        private readonly Type         _itemType;
        private readonly TypeAccessor _typeAccessor;

        private NullValueProvider _getNullValue;
        public  NullValueProvider  GetNullValue
        {
            get
            {
                if (_getNullValue == null)
                    _getNullValue = TypeAccessor.GetNullValue;

                return _getNullValue;
            }

            set { _getNullValue = value; }
        }

        #region ITypedList Members

        private PropertyDescriptorCollection _pdc;

        public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
        {
            return GetItemProperties(listAccessors, null, null, true);
        }

        public PropertyDescriptorCollection GetItemProperties(
            PropertyDescriptor[] listAccessors,
            Type                 objectViewType,
            IsNullHandler        isNull,
            bool                 cache)
        {
            PropertyDescriptorCollection pdc = null;

            if (listAccessors == null || listAccessors.Length == 0)
            {
                if (_pdc == null)
                {
                    _pdc = _typeAccessor != null?
                        _typeAccessor.CreateExtendedPropertyDescriptors(objectViewType, isNull):
                        new PropertyDescriptorCollection(null);
                }

                pdc = _pdc;

                if (!cache)
                    _pdc = null;
            }
            else
            {
                try
                {
                    // Lets try to pick out the item type from the list type.
                    //
                    Type itemType = TypeHelper.GetListItemType(
                        listAccessors[listAccessors.Length - 1].PropertyType);

                    if (itemType == typeof(object))
                    {
                        TypeAccessor parentAccessor = _typeAccessor;

                        foreach (PropertyDescriptor pd in listAccessors)
                        {
                            // We have to create an instance of the list to determine its item type
                            //

                            // Create an instance of the parent.
                            //
                            object parentObject = parentAccessor.CreateInstanceEx();

                            // Create an instance of the list.
                            //
                            object listObject   = pd.GetValue(parentObject);

                            if (listObject == null)
                            {
                                // We failed. Item type can not be determined.
                                //
                                itemType = null;

                                break;
                            }

                            itemType = TypeHelper.GetListItemType(listObject);

                            // Still bad.
                            //
                            if (itemType == typeof(object))
                                break;

                            parentAccessor = TypeAccessor.GetAccessor(itemType);
                        }
                    }

                    if (itemType != null && itemType != typeof(object))
                    {
                        TypeAccessor ta = TypeAccessor.GetAccessor(itemType);

                        pdc = ta.CreateExtendedPropertyDescriptors(null, isNull);
                    }
                }
                catch
                {
                }

                if (pdc == null)
                    pdc = new PropertyDescriptorCollection(null);
            }

            return pdc;
        }

        public string GetListName(PropertyDescriptor[] listAccessors)
        {
            string name = _itemType.Name;

            if (listAccessors != null)
                foreach (PropertyDescriptor pd in listAccessors)
                    name += "_" + pd.Name;

            return name;
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net