internal protected virtual object GetRegistryValue(RegistryFieldGetRegistryValueParameters e) { var key = GetRegistryKey(e.PropertyInfo); var value = e.Root.GetValue(key); var propertyType = Nullable.GetUnderlyingType(e.PropertyInfo.PropertyType) ?? e.PropertyInfo.PropertyType; if (value != null && propertyType.IsEnum) { value = Enum.Parse(propertyType, value.ToString()); } if (value != null && !propertyType.IsEnum) { if (value is string && propertyType != typeof(string)) { //var parseMethod = propertyType.GetMethod("Parse", BindingFlags.Static); //if(parseMethod != null) //{ // value = parseMethod.Invoke(value) //} if (propertyType == typeof(bool)) { value = bool.Parse((string)value); } else if (propertyType == typeof(short)) { value = short.Parse((string)value); } else if (propertyType == typeof(long)) { value = long.Parse((string)value); } else if (propertyType == typeof(int)) { value = int.Parse((string)value); } else if (propertyType == typeof(double)) { value = double.Parse((string)value, CultureInfo.InvariantCulture); } else if (propertyType == typeof(decimal)) { value = decimal.Parse((string)value, CultureInfo.InvariantCulture); } else if (propertyType == typeof(DateTime)) { value = DateTime.Parse((string)value, CultureInfo.InvariantCulture); } else { throw new NotImplementedException("PropertyType: " + propertyType.FullName); } } value = Convert.ChangeType(value, propertyType); } return(value); }
private static object GetEntity(Type type, RegistryKey root) { var entityAttribute = type.GetCustomAttribute <RegistryEntityAttribute>(); if (entityAttribute == null) { throw new MissingAttributeException(type, typeof(RegistryEntityAttribute)); } var properties = type.GetProperties().Select(x => { return(new { PropertyInfo = x, FieldAttribute = x.GetCustomAttribute <RegistryFieldAttribute>() }); }).Where(x => x.FieldAttribute != null).ToArray(); object entity = null; using (var registryKey = root.OpenSubKey(RootPath + entityAttribute.Path, RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey)) { if (registryKey != null) { entity = Activator.CreateInstance(type); //TODO subentities foreach (var property in properties) { var pi = property.PropertyInfo; var e1 = new RegistryFieldGetRegistryValueParameters(registryKey, type, pi); var registryValue = property.FieldAttribute.GetRegistryValue(e1); property.FieldAttribute.SetPropertyValue(new RegistryFieldSetPropertyValueParameters(type, pi, entity, registryValue)); } } } return(entity); }