public static T ConvertFromRedis <T>(this HashEntry[] hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if ((entry.Equals(new HashEntry()))) { continue; } if ((property.PropertyType.Name.Contains("List") || property.PropertyType.IsClass)) { property.SetValue(obj, JsonConvert.DeserializeObject(entry.Value.ToString(), property.PropertyType)); continue; } else { property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } } return((T)obj); }
/// <summary> /// Converts a set of hash entries to a POCO /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hashEntries"></param> /// <returns></returns> public static T ConvertFromRedis <T>(HashEntry[] hashEntries) { var properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { var redisFieldInfo = property.CustomAttributes .FirstOrDefault(x => x.AttributeType.Name == nameof(RedisHashFieldAttribute)); var redisPropertyName = property.Name; if (redisFieldInfo != null) { redisPropertyName = redisFieldInfo.ConstructorArguments[0].Value.ToString(); } HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(redisPropertyName)); if (entry.Equals(new HashEntry())) { continue; } if (property.PropertyType == typeof(String[])) { String[] blah = new [] { entry.Value.ToString() }; property.SetValue(obj, Convert.ChangeType(blah, property.PropertyType)); } else { property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } } return((T)obj); }
/// <summary> /// 轉換HashEntry到Class /// 若該Class成員有JsonPropertyAttribute則使用該Attribute的Name作為Key /// </summary> /// <typeparam name="T">目標類型</typeparam> /// <param name="hashEntries">Hash Entries</param> /// <returns></returns> public T Deserialize <T>(IEnumerable <HashEntry> hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { string name = GetPropertyNameFunc(property); HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(name)); if (entry.Equals(new HashEntry())) { continue; } if (CustomDeserializeFunc.ContainsKey(property.PropertyType)) { property.SetValue(obj, CustomDeserializeFunc[property.PropertyType](entry.Value, property.PropertyType)); } else { property.SetValue(obj, DefaultDeserialize(entry.Value, property.PropertyType)); } } return((T)obj); }
//Deserialize from Redis format public static T ConvertFromRedis <T>(this HashEntry[] hashEntries) { if (!hashEntries.Any()) { return(default(T)); //null for nullable value, 0 for int, '\0' for char etc } PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } if (!property.CanWrite) { continue; //skip read only } var type = property.PropertyType; var value = GetValue(type, entry.Value); property.SetValue(obj, value); } return((T)obj); }
/// <summary> /// Converts the given hashset into object of type T /// </summary> /// <typeparam name="T">type of object</typeparam> /// <param name="hashEntries">list of hashentry</param> /// <returns>object of type T</returns> protected T FromHasSet <T>(HashEntry[] hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault( g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } if (entry.Value.HasValue) { property.SetValue(obj, Convert.ChangeType( Convert.ToString(entry.Value), property.PropertyType)); } } return((T)obj); }
/// <summary> /// 轉換HashEntry到Class /// 若該Class成員有JsonPropertyAttribute則使用該Attribute的Name作為Key /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hashEntries"></param> /// <returns></returns> public static T ConvertHashEntriesToJsonClass <T>(this IEnumerable <HashEntry> hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { var attr = property.GetCustomAttribute <JsonPropertyAttribute>(); string name = attr.IsNonNull() ? attr.PropertyName : property.Name; HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(name)); if (entry.Equals(new HashEntry())) { continue; } if (property.PropertyType.IsArray) { property.SetValue(obj, JsonConvert.DeserializeObject(entry.Value.ToString(), property.PropertyType)); } else { property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } } return((T)obj); }
//Deserialize from Redis format public static T ConvertFromRedis <T>(this HashEntry[] hashEntries) { var properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } return((T)obj); }
/// <summary> /// HashEntity转换为对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hashEntries"></param> /// <returns></returns> public static T ToObjFromRedis <T>(this HashEntry[] hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties().Where(p => p.CanWrite).ToArray(); var obj = Activator.CreateInstance <T>(); foreach (var property in properties) { Type[] types = property.PropertyType.GenericTypeArguments; HashEntry hashEntry = hashEntries.FirstOrDefault(h => h.Name.ToString().Equals(property.Name, StringComparison.CurrentCultureIgnoreCase)); if (hashEntry.Equals(default(HashEntry))) { continue; } if (types.Length > 0) { var fullName = types[0].FullName; if (fullName != null && fullName.IndexOf("System", StringComparison.Ordinal) != -1) { property.SetValue(obj, Convert.ChangeType(hashEntry.Value, types[0]), null); } else if (types[0].BaseType == typeof(Enum)) { property.SetValue(obj, Enum.Parse(types[0], hashEntry.Value.ToString()), null); } else { property.SetValue(obj, Convert.ChangeType(hashEntry.Value, property.PropertyType), null); } } else { if (property.PropertyType.BaseType == typeof(Enum)) { property.SetValue(obj, Enum.Parse(property.PropertyType, hashEntry.Value), null); } else { property.SetValue(obj, Convert.ChangeType(hashEntry.Value, property.PropertyType), null); } } } return(obj); }
//build object from hash entry array using reflection T MapFromHash(HashEntry[] hash) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = (T)Activator.CreateInstance(TypeOfT);//new instance of T foreach (var property in properties) { HashEntry entry = hash.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } return(obj); }
//Deserialize from Redis format public static T ConvertFromRedis <T>(this HashEntry[] hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); object obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { Type t = property.PropertyType; if (IsPrimitive(t)) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } if (entry.Value.HasValue && !string.IsNullOrEmpty(entry.Value.ToString())) { property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } } } return((T)obj); }
static T ToEntity <T>(HashEntry[] hashEntries) { Type t = typeof(T); PropertyInfo[] properties = t.GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if (entry.Equals(new HashEntry())) { continue; } object value = null; if (!property.PropertyType.IsGenericType) { value = Convert.ChangeType(entry.Value.ToString(), property.PropertyType); } else { Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(Nullable <>)) { if (entry.Value.HasValue) { value = Convert.ChangeType(entry.Value.ToString(), Nullable.GetUnderlyingType(property.PropertyType)); } } } property.SetValue(obj, value); } return((T)obj); }