Пример #1
0
        // Complete
        public PropItemModel
        (
            Type type,
            string name,
            PropStorageStrategyEnum storageStrategy,
            bool typeIsSolid,
            PropKindEnum propKind,
            ITypeInfoField propTypeInfoField,
            IPropInitialValueField initialValueField,
            object extraInfo,
            IPropComparerField comparer,
            Type itemType,
            IPropBinderField binderField,
            IMapperRequest mapperRequest,
            PropCreatorType propCreator
        )
        {
            PropertyType      = type;
            PropertyName      = name;
            ExtraInfo         = extraInfo;
            StorageStrategy   = storageStrategy;
            TypeIsSolid       = typeIsSolid;
            PropKind          = propKind;
            PropTypeInfoField = _propTypeInfoField;
            InitialValueField = initialValueField;
            ComparerField     = comparer;
            _itemType         = itemType;
            _propBinderField  = binderField;
            _mapperRequest    = mapperRequest;
            _propCreator      = propCreator;

            InitialValueCooked = null;
        }
Пример #2
0
        private Type GetTypeFromInfoField(DRM.PropBagControlsWPF.TypeInfoField tif, PropKindEnum propKind,
                                          Type propertyType, out Type itemType)
        {
            itemType = null;
            switch (propKind)
            {
            case PropKindEnum.Prop:
                itemType = null;
                return(propertyType);

            case PropKindEnum.CollectionView:
                itemType = propertyType;
                Type pType = typeof(ListCollectionView);     // typeof(ICollectionView);
                return(pType);

            case PropKindEnum.Enumerable_RO:
                goto case PropKindEnum.ObservableCollection;

            case PropKindEnum.Enumerable:
                goto case PropKindEnum.ObservableCollection;

            case PropKindEnum.EnumerableTyped_RO:
                goto case PropKindEnum.ObservableCollection;

            case PropKindEnum.EnumerableTyped:
                goto case PropKindEnum.ObservableCollection;


            case PropKindEnum.ObservableCollection_RO:
                goto case PropKindEnum.ObservableCollection;

            case PropKindEnum.ObservableCollection:
                return(GetTypeFromCollInfoField(tif, propertyType, out itemType));


            case PropKindEnum.CollectionViewSource_RO:
                goto case PropKindEnum.CollectionViewSource;

            case PropKindEnum.CollectionViewSource:
                Type result = typeof(CollectionViewSource);
                itemType = propertyType;
                return(result);


            case PropKindEnum.DataTable_RO:
                goto case PropKindEnum.DataTable;

            case PropKindEnum.DataTable:
                itemType = null;
                return(typeof(DataTable));

            default:
                throw new InvalidOperationException($"PropKind = {propKind} is not recognized or is not supported.");
            }
        }
Пример #3
0
        public PBCollectionDSP_Provider(PropKindEnum propKind, IWatchAPropItemGen propItemWatcherGen)
        {
            _propKind = propKind;

            if (!(_propKind == PropKindEnum.ObservableCollection /* || _propKind == PropKindEnum.ObservableCollectionFB*/))
            {
                throw new NotSupportedException($"This IProvideADataSourceProvider {nameof(PBCollectionDSP_Provider)} cannot create a DataSourceProvider for Prop Items with Kind = {_propKind}.");
            }

            _isReadOnly         = false;
            _propItemWatcherGen = propItemWatcherGen;
        }
Пример #4
0
        protected virtual IPropTemplate <T> GetPropTemplate <T>
        (
            PropKindEnum propKindEnum,
            PropStorageStrategyEnum storageStrategy,
            Func <T, T, bool> comparer,
            bool comparerIsRefEquality,
            Func <string, T> getDefaultVal
        )
        {
            // Supply a comparer, if one was not supplied by the caller.
            bool comparerIsDefault;

            if (comparer == null)
            {
                comparer          = EqualityComparer <T> .Default.Equals;
                comparerIsDefault = true;
            }
            else
            {
                comparerIsDefault = false;
            }

            bool defaultValFuncIsDefault;

            // Use the Get Default Value function supplied or provided by this Prop Factory.
            if (getDefaultVal == null)
            {
                getDefaultVal           = ValueConverter.GetDefaultValue <T>;
                defaultValFuncIsDefault = true;
            }
            else
            {
                defaultValFuncIsDefault = false;
            }

            IPropTemplate <T> propTemplateTyped = new PropTemplateTyped <T>
                                                  (
                propKindEnum,
                storageStrategy,
                this.GetType(),
                comparerIsDefault,
                comparerIsRefEquality,
                comparer,
                getDefaultVal,
                defaultValFuncIsDefault
                                                  );

            IPropTemplate <T> existingEntry = (IPropTemplate <T>)DelegateCacheProvider.PropTemplateCache.GetOrAdd(propTemplateTyped);

            return(existingEntry);
        }
Пример #5
0
 private static void CheckPropKindSpecial(PropKindEnum propKind)
 {
     if (!
         (
             propKind == PropKindEnum.CollectionView ||
             propKind == PropKindEnum.CollectionViewSource ||
             propKind == PropKindEnum.CollectionViewSource_RO ||
             propKind == PropKindEnum.DataTable ||
             propKind == PropKindEnum.DataTable_RO
         )
         )
     {
         throw new InvalidOperationException($"The PropKind: {propKind} is not supported.");
     }
 }
Пример #6
0
        public PropTemplateTyped(PropKindEnum propKind, PropStorageStrategyEnum storageStrategy,
                                 Type propFactoryType, bool comparerIsDefault, bool comparerIsRefEquality,
                                 Func <T, T, bool> comparer, Func <string, T> defaultValFunc, bool defaultValFuncIsDefault)
        {
            PropKind        = propKind;
            Type            = typeof(T);
            StorageStrategy = storageStrategy;
            Attributes      = new Attribute[] { };

            ComparerIsDefault     = comparerIsDefault;
            ComparerIsRefEquality = comparerIsRefEquality;
            Comparer      = comparer;
            GetDefaultVal = defaultValFunc;

            PropFactoryType = propFactoryType;

            _hashCode = ComputetHashCode();
        }
Пример #7
0
 // Type, Name, StorageStrategy, Kinde and Initial Value -- With ItemType
 public PropItemModel(Type type, string name, PropStorageStrategyEnum storageStrategy,
                      PropKindEnum propKind, IPropInitialValueField initialValueField, Type itemType)
     : this
     (
         type : type,
         name : name,
         storageStrategy : storageStrategy,
         typeIsSolid : true,
         propKind : propKind,
         propTypeInfoField : null,
         initialValueField : initialValueField,
         extraInfo : null,
         comparer : null,
         itemType : itemType,
         binderField : null,
         mapperRequest : null,
         propCreator : null
     )
 {
 }
Пример #8
0
 private static void CheckPropKind(PropKindEnum propKind)
 {
     if (!
         (
             propKind == PropKindEnum.CollectionView ||
             propKind == PropKindEnum.CollectionViewSource ||
             propKind == PropKindEnum.CollectionViewSource_RO ||
             propKind == PropKindEnum.DataTable ||
             propKind == PropKindEnum.DataTable_RO ||
             propKind == PropKindEnum.Prop ||
             propKind == PropKindEnum.ObservableCollection ||
             propKind == PropKindEnum.EnumerableTyped ||
             propKind == PropKindEnum.Enumerable ||
             propKind == PropKindEnum.ObservableCollection_RO ||
             propKind == PropKindEnum.EnumerableTyped_RO ||
             propKind == PropKindEnum.Enumerable_RO
         )
         )
     {
         throw new InvalidOperationException($"The PropKind: {propKind} is not supported.");
     }
 }
Пример #9
0
 public static bool IsReadOnly(this PropKindEnum propKind)
 {
     if (propKind == PropKindEnum.Prop)
     {
         return(false);
     }
     else if
     (
         propKind == PropKindEnum.CollectionViewSource_RO ||
         propKind == PropKindEnum.ObservableCollection_RO ||
         propKind == PropKindEnum.EnumerableTyped_RO ||
         propKind == PropKindEnum.Enumerable_RO
     )
     {
         return(true);
     }
     else
     {
         CheckPropKind(propKind);
         return(false);
     }
 }
Пример #10
0
 public static bool IsCollection(this PropKindEnum propKind)
 {
     if (propKind == PropKindEnum.Prop)
     {
         return(false);
     }
     else if
     (
         propKind == PropKindEnum.ObservableCollection ||
         propKind == PropKindEnum.EnumerableTyped ||
         propKind == PropKindEnum.Enumerable ||
         propKind == PropKindEnum.ObservableCollection_RO ||
         propKind == PropKindEnum.EnumerableTyped_RO ||
         propKind == PropKindEnum.Enumerable_RO
     )
     {
         return(true);
     }
     else
     {
         CheckPropKindSpecial(propKind);
         return(false);
     }
 }
Пример #11
0
        //public virtual IProp CreateGenFromString(Type typeOfThisProperty,
        //    string value, bool useDefault,
        //    PropNameType propertyName, object extraInfo,
        //    PropStorageStrategyEnum storageStrategy, bool isTypeSolid, PropKindEnum propKind,
        //    Delegate comparer, bool useRefEquality = false, Type itemType = null)
        //{
        //    MemConsumptionTracker mct = new MemConsumptionTracker(enabled: false);

        //    if (propKind == PropKindEnum.Prop)
        //    {
        //        CreateScalarProp propCreator = GetPropCreator(typeOfThisProperty);
        //        mct.MeasureAndReport("GetPropCreator", $"for {propertyName}");

        //        // TODO: This is where strings are parsed to create objects of type T.
        //        // TODO: This needs more work, to say the least.


        //        IProp prop = propCreator(this, haveValue: true, value: value, useDefault: useDefault, propertyName: propertyName,
        //            extraInfo: extraInfo, storageStrategy: storageStrategy, isTypeSolid: isTypeSolid,
        //            comparer: comparer, useRefEquality: useRefEquality, getDefaultValFunc: null);

        //        mct.MeasureAndReport("Ran propCreator to get IProp", $"for {propertyName}");

        //        return prop;
        //    }
        //    else if (propKind.IsCollection())
        //    {
        //        CreateCPropFromStringDelegate propCreator = GetCPropFromStringCreator(typeOfThisProperty, itemType);
        //        mct.MeasureAndReport("GetCPropFromStringCreator", $"for {propertyName}");

        //        IProp prop = propCreator(this, value: value, useDefault: useDefault, propertyName: propertyName,
        //            extraInfo: extraInfo, storageStrategy: storageStrategy, isTypeSolid: isTypeSolid,
        //            comparer: comparer, useRefEquality: useRefEquality);

        //        mct.MeasureAndReport("Ran GetCPropFromStringCreator to get IProp", $"for {propertyName}");

        //        return prop;
        //    }
        //    else
        //    {
        //        throw new InvalidOperationException($"PropKind = {propKind} is not recognized or is not supported.");
        //    }
        //}

        public virtual IProp CreateGenWithNoValue(Type typeOfThisProperty,
                                                  PropNameType propertyName, object extraInfo,
                                                  PropStorageStrategyEnum storageStrategy, bool isTypeSolid, PropKindEnum propKind,
                                                  Delegate comparer, bool useRefEquality = false, Type itemType = null)
        {
            MemConsumptionTracker mct = new MemConsumptionTracker(enabled: false);

            if (propKind == PropKindEnum.Prop)
            {
                CreateScalarProp propCreator = GetPropCreator(typeOfThisProperty);
                mct.MeasureAndReport("GetPropCreator", $"for {propertyName}");

                IProp prop = propCreator(this, haveValue: false, value: null, useDefault: false, propertyName: propertyName,
                                         extraInfo: extraInfo, storageStrategy: storageStrategy, isTypeSolid: isTypeSolid,
                                         comparer: comparer, useRefEquality: useRefEquality, getDefaultValFunc: null);

                mct.MeasureAndReport("Ran propCreator to get IProp", $"for {propertyName}");

                return(prop);
            }
            else if (propKind.IsCollection())
            {
                CreateCPropWithNoValueDelegate propCreator = GetCPropWithNoValueCreator(typeOfThisProperty, itemType);
                IProp prop = propCreator(this, propertyName: propertyName,
                                         extraInfo: extraInfo, storageStrategy: storageStrategy, isTypeSolid: isTypeSolid,
                                         comparer: comparer, useRefEquality: useRefEquality);

                return(prop);
            }
            else
            {
                throw new InvalidOperationException($"PropKind = {propKind} is not recognized or is not supported.");
            }
        }