Esempio n. 1
0
        /// <summary>
        /// Helper method to set value of a member.
        /// </summary>
        /// <param name="target"></param>
        /// <param name="targetType"></param>
        /// <param name="memberMap"></param>
        /// <param name="memberName"></param>
        /// <param name="memberValue"></param>
        internal void SetMemberValue(object target, Type targetType, MemberMap memberMap, string memberName, object memberValue)
        {
            if (target == null)
            {
                return;
            }

            if (target is IDictionary <string, object> )
            {
                // needed for ExpandoObject which unfortunately does not implement IDictionary
                ((IDictionary <string, object>)target)[memberName] = memberValue;
            }
            else if (target is IDictionary)
            {
                ((IDictionary)target)[memberName] = memberValue;
            }
#if NET40 && !WINDOWS_PHONE
            else if (target is System.Dynamic.DynamicObject)
            {
                // TODO: expand to all IDynamicMetaObjectProvider?
                ((System.Dynamic.DynamicObject)target).TrySetMember(new DynamicSetter(memberName), memberValue);
            }
#endif
            else if (targetType != null
#if !NETCF
                     && targetType.GetInterface(TypeCoercionUtility.TypeGenericIDictionary, false) != null
#endif
                     )
            {
                throw new TypeCoercionException(String.Format(
                                                    TypeCoercionUtility.ErrorGenericIDictionary,
                                                    targetType));
            }
            else if (memberMap != null && memberMap.Setter != null)
            {
                if (memberValue == null)
                {
                    memberMap.Setter(target,
                                     memberMap.Type.IsValueType ?
                                     Activator.CreateInstance(memberMap.Type, true) :
                                     null);
                }
                else
                {
                    memberMap.Setter(target, this.CoerceType(memberMap.Type, memberValue));
                }
            }

            // ignore non-applicable members
        }