private object GetValueToSet(string propertyName, string value, TrackedInstance instance, ref Type memberType) { object valueToSet = null; if (value == null && (IsNullableType(memberType) || !memberType.IsValueType)) { // keep it null valueToSet = null; } else { memberType = ExtractNullableUnderlyingType(memberType); var typeCode = GetCodeForType(memberType); if (typeCode != TypeCode.Empty) { valueToSet = ConvertType(propertyName, value, typeCode, instance, memberType); } else { if (memberType.IsEnum) { valueToSet = SetEnumPropertyValue(propertyName, value, memberType, instance); } else { throw new NoKnownWayToParseToTypeException(memberType); } } } return(valueToSet); }
public Guid AddObject(object obj, string name, Guid?parentId) { var instance = new TrackedInstance(obj) { Name = name, ParentId = parentId }; _objects.TryAdd(instance.Id, instance); return(instance.Id); }
private static void GetMemberInfo(string propertyName, TrackedInstance instance, out PropertyInfo property, out FieldInfo field) { property = null; field = null; var rawObjectType = instance.RawObject.GetType(); property = rawObjectType .GetProperties() .Where(x => x.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)) .SingleOrDefault(); if (property == null) { field = rawObjectType.GetFields().Where(x => x.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); } }
private static object ConvertType(string propertyName, string value, TypeCode typeCode, TrackedInstance instance, Type propertyType) { object convertedValue; try { convertedValue = Convert.ChangeType(value, typeCode); } catch { throw new InvalidPropertyValueConversionException(instance.RawObject.GetType(), propertyName, propertyType, value); } return(convertedValue); }
private static Type GetMemberType(string propertyName, TrackedInstance instance, PropertyInfo property, FieldInfo field) { Type memberType; if (property == null && field == null) { throw new PropertyDoesntExistException(instance.RawObject.GetType(), propertyName); } else if (property != null) { memberType = property.PropertyType; } else // if field != null { memberType = field.FieldType; } return(memberType); }
private object SetEnumPropertyValue(string propertyName, string value, Type propertyType, TrackedInstance instance) { if (propertyType.IsEnumDefined(value)) { var parsedValue = Enum.Parse(propertyType, value); return(parsedValue); } else { throw new InvalidPropertyValueConversionException(instance.RawObject.GetType(), propertyName, propertyType, value); } }