// 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;
}
}
}