protected override object GetPropertyValue(ReflectObjectProperties wrapper, object reflectedObject) { var value = reflectedMember.GetValue(reflectedObject); if (value != null) { value = CoerceValue(value); } return(value); }
public void Set(ReflectObjectProperties wrapper, object reflectedObject) { var memberExists = MemberExists(); if (memberExists) { var value = GetPropertyValue(wrapper, reflectedObject); if (value != null) { OwnPropertySetter(wrapper, value); } } }
protected override object GetPropertyValue(ReflectObjectProperties wrapper, object reflectedObject) { return(MethodWrapper.CreateDelegateWrapper(reflectedMember, reflectedObject, ownProperty.PropertyType, isAction)); }
protected abstract object GetPropertyValue(ReflectObjectProperties wrapper, object reflectedObject);
private object CoerceValue(object value) { if (coerceValue == null) { if (ReflectObjectProperties.IsReflectObjectPropertiesType(ownPropertyType)) { coerceValue = v => Wrap(ownPropertyType, v); } else { /* * implement another time - List<> and IEnumerable<> will be sufficient * if (ownPropertyType.IsArray) * { * var elementType = ownPropertyType.GetElementType(); * ... * * } */ // will know path taken so should be able to store - again as a static if (ownPropertyType.IsGenericType) { var genericArguments = ownPropertyType.GetGenericArguments(); var genericArgument = genericArguments[0]; if (genericArguments.Length == 1 && ReflectObjectProperties.IsReflectObjectPropertiesType(genericArgument)) { var genericTypeDefinitionType = ownPropertyType.GetGenericTypeDefinition(); if (genericTypeDefinitionType == listType) { var constructedListType = listType.MakeGenericType(genericArgument); var addMethod = constructedListType.GetMethod("Add"); coerceValue = v => { var list = Activator.CreateInstance(constructedListType); var enumerator = (v as IEnumerable).GetEnumerator(); while (enumerator.MoveNext()) { addMethod.Invoke(list, new object[] { enumerator.Current == null ? null : Wrap(genericArgument, enumerator.Current) }); } return(list); }; } else if (genericTypeDefinitionType == enumerableTTYpe) { var createEnumerableMethodInfo = GetCreateEnumerableMethodInfo(genericArgument); coerceValue = v => createEnumerableMethodInfo.Invoke(this, new object[] { v }); } } } } if (coerceValue == null) { coerceValue = v => v; } } return(coerceValue(value)); }