// Author: Gockner, Simon // Created: 2020-02-13 // Copyright(c) 2020 SimonG. All Rights Reserved. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using GBase.Api; using GBase.Exceptions; namespace GBase.Helpers { internal static class Enumerables { private const char ENUMERABLE_STRING_DIVIDER = ','; /// /// Convert an to a GBase /// /// The /// public static string ToGBaseString(this IEnumerable enumerable) { StringBuilder @string = new StringBuilder(); foreach (var item in enumerable) { @string.Append($"{item}{ENUMERABLE_STRING_DIVIDER}"); } char lastChar = @string[^1]; if (lastChar == ENUMERABLE_STRING_DIVIDER) @string.Remove(@string.Length - 1, 1); return @string.ToString(); } /// /// Convert a given to an of /// /// The /// The given /// An of /// Interface was passed to an public static TEnumerable ConvertToGBaseEnumerable(string @string) { //get generic type parameter of TEnumerable Type genericType = typeof(TEnumerable).GetGenericArguments()[0]; Type listType = typeof(List<>); Type genericList = listType.MakeGenericType(genericType); IList enumerable = (IList) Activator.CreateInstance(genericList); foreach (var value in @string.Split(ENUMERABLE_STRING_DIVIDER)) { object item; if (genericType.GetInterfaces().Contains(typeof(IGBaseObject))) { if (genericType.IsInterface) throw new InterfaceEnumerablePassedException(genericType); IGBaseObject gBaseObject = (IGBaseObject) Activator.CreateInstance(genericType); gBaseObject.InitializeFromString(value); item = gBaseObject; } else item = Convert.ChangeType(value, genericType); enumerable.Add(item); } return (TEnumerable) enumerable; } } }