/// <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 }