/// <summary>
        /// Initializes a new instance of the <see cref="EntityBindingDetail"/> class.
        /// </summary>
        /// <param name="entityProperty">The entity property.</param>
        /// <param name="valueKey">The value key.</param>
        /// <param name="bindingType">Type of the binding.</param>
        /// <param name="valueWriter">Value writer for the associated value type</param>
        /// <param name="valueReader">Value reader for the associated value type</param>
        public EntityPropertyConversionDetail(PropertyInfo entityProperty, string valueKey, BindingType bindingType, IBaseValueWriter valueWriter, IBaseValueReader valueReader)
        {
            this.EntityProperty = entityProperty;
            this.ValueKey = valueKey;
            this.BindingType = bindingType;

            this.ValueWriter = valueWriter;
            this.ValueReader = valueReader;
        }
        /// <summary>
        /// Updates the given SPListItem with the value passed.
        /// This method does not call Update or SystemUpdate.
        /// </summary>
        /// <param name="item">The SharePoint list item to update.</param>
        /// <param name="fieldValueInfo">The value information to be updated in the SPListItem.</param>
        public void WriteValueToListItem(SPListItem item, FieldValueInfo fieldValueInfo)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            if (fieldValueInfo == null || fieldValueInfo.FieldInfo == null)
            {
                throw new ArgumentNullException("fieldValueInfo");
            }

            IBaseValueWriter valueWriter = this.GetWriter(fieldValueInfo);

            valueWriter.WriteValueToListItem(item, fieldValueInfo);
        }
        /// <summary>
        /// Updates the specified SPFolder with new default field value
        /// </summary>
        /// <param name="folder">The SharePoint folder for which we want to update the metadata defaults.</param>
        /// <param name="defaultFieldValueInfo">The default value to be applied to items created within that folder.</param>
        public void WriteValuesToFolderDefault(SPFolder folder, FieldValueInfo defaultFieldValueInfo)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (defaultFieldValueInfo == null || defaultFieldValueInfo.FieldInfo == null)
            {
                throw new ArgumentNullException("defaultFieldValueInfo");
            }

            IBaseValueWriter valueWriter = this.GetWriter(defaultFieldValueInfo);

            valueWriter.WriteValueToFolderDefault(folder, defaultFieldValueInfo);
        }
        /// <summary>
        /// Updates the specified SPField definition with new DefaultValue
        /// </summary>
        /// <param name="parentFieldCollection">The SharePoint field collection containing the field to update.</param>
        /// <param name="defaultFieldValueInfo">The default value to be applied as the SPField' new default.</param>
        public void WriteValueToFieldDefault(SPFieldCollection parentFieldCollection, FieldValueInfo defaultFieldValueInfo)
        {
            if (parentFieldCollection == null)
            {
                throw new ArgumentNullException("parentFieldCollection");
            }

            if (defaultFieldValueInfo == null || defaultFieldValueInfo.FieldInfo == null)
            {
                throw new ArgumentNullException("defaultFieldValueInfo");
            }

            IBaseValueWriter valueWriter = this.GetWriter(defaultFieldValueInfo);

            valueWriter.WriteValueToFieldDefault(parentFieldCollection, defaultFieldValueInfo);
        }
        private IBaseValueWriter GetWriter(FieldValueInfo fieldValueInfo)
        {
            var associatedValueType      = fieldValueInfo.FieldInfo.AssociatedValueType;
            IBaseValueWriter valueWriter = null;

            if (this.writers.ContainsKey(associatedValueType))
            {
                valueWriter = this.writers[associatedValueType];
            }
            else
            {
                throw new ArgumentException(string.Format(
                                                CultureInfo.InvariantCulture,
                                                "Failed to find a value writer for your FieldInfo's AssociatedValueType (field={0}, valueType={1})",
                                                fieldValueInfo.FieldInfo.InternalName,
                                                associatedValueType.ToString()));
            }

            return(valueWriter);
        }
        /// <summary>
        /// Extracts the values from the entity to fill the values.
        /// </summary>
        /// <typeparam name="T">The type of the entity.</typeparam>
        /// <param name="entity">The entity.</param>
        /// <param name="listItem">The list item.</param>
        public void FromEntity <T>(T entity, SPListItem listItem)
        {
            var schema         = this.entitySchemaFactory.GetSchema(typeof(T));
            var listItemFields = listItem.Fields;

            foreach (var binding in schema.PropertyConversionDetails.ToList().Where(x => x.BindingType == BindingType.Bidirectional || x.BindingType == BindingType.WriteOnly))
            {
                var valueFromEntity     = binding.EntityProperty.GetValue(entity, null);
                IBaseValueWriter writer = binding.ValueWriter;

                // Create a MinimalFieldInfo<TValueType> to feed into the FieldValueInfo needed to
                // interact with IBaseValueWriter
                var     minimalFieldInfoType = typeof(MinimalFieldInfo <>).MakeGenericType(writer.AssociatedValueType);
                string  fieldInternalName    = binding.ValueKey;
                SPField itemField            = listItemFields.GetFieldByInternalName(fieldInternalName);
                var     minimalFieldInfo     = (BaseFieldInfo)Activator.CreateInstance(minimalFieldInfoType, new object[] { fieldInternalName, itemField.Id });
                var     fieldValueInfo       = new FieldValueInfo(minimalFieldInfo, valueFromEntity);

                // Update the list item through the IBaseValueWriter
                writer.WriteValueToListItem(listItem, fieldValueInfo);
            }
        }
 private void AddToWritersDictionary(IBaseValueWriter writer)
 {
     this.writers.Add(writer.AssociatedValueType, writer);
 }
 private void AddToWritersDictionary(IBaseValueWriter writer)
 {
     this.writers.Add(writer.AssociatedValueType, writer);
 }
Exemple #9
0
        /// <summary>
        /// Initializes a new instance of the <see cref="EntityBindingDetail"/> class.
        /// </summary>
        /// <param name="entityProperty">The entity property.</param>
        /// <param name="valueKey">The value key.</param>
        /// <param name="bindingType">Type of the binding.</param>
        /// <param name="valueWriter">Value writer for the associated value type</param>
        /// <param name="valueReader">Value reader for the associated value type</param>
        public EntityPropertyConversionDetail(PropertyInfo entityProperty, string valueKey, BindingType bindingType, IBaseValueWriter valueWriter, IBaseValueReader valueReader)
        {
            this.EntityProperty = entityProperty;
            this.ValueKey       = valueKey;
            this.BindingType    = bindingType;

            this.ValueWriter = valueWriter;
            this.ValueReader = valueReader;
        }