示例#1
0
    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);
    }
示例#2
0
    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);
    }