#11: add implementation for reading iEnumerables

pull/26/head
Simon Gockner 6 years ago
parent b840eb00bf
commit 6d8416cb7d
  1. 7
      GBase/DataHandling/XmlDataReader.cs
  2. 27
      GBase/Exceptions/InterfaceEnumerablePassedException.cs
  3. 4
      GBase/GBase.csproj
  4. 19
      GBase/GBase.xml
  5. 48
      GBase/Helpers/Enumerables.cs
  6. 7
      GBase/Properties/AssemblyInfo.cs

@ -10,6 +10,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using GBase.Helpers;
using GBase.Interfaces.DataHandling;
using GBase.Interfaces.DataHandling.Xml;
@ -90,10 +91,8 @@ namespace GBase.DataHandling
IEnumerable<string> values = valueElements.Select(v => v.Value);
if (typeof(TProperty) != typeof(string) && typeof(TProperty).GetInterfaces().Contains(typeof(IEnumerable)))
{
return null; //FixMe: Implement handling for IEnumerables
}
if (typeof(TProperty) != typeof(string) && typeof(TProperty).GetInterfaces().Contains(typeof(IEnumerable))) //read property is an IEnumerable
return values.Select(Enumerables.ConvertToGBaseEnumerable<TProperty>).ToList();
return values.Select(value => (TProperty)Convert.ChangeType(value, typeof(TProperty))).ToList();
}, _cancellationToken);

@ -0,0 +1,27 @@
// Author: Gockner, Simon
// Created: 2020-02-14
// Copyright(c) 2020 SimonG. All Rights Reserved.
using System;
using System.Collections.Generic;
namespace GBase.Exceptions
{
/// <summary>
/// <see cref="Exception"/> that an interface was passed as the generic type of an <see cref="IEnumerable{T}"/>
/// </summary>
public class InterfaceEnumerablePassedException : Exception
{
/// <summary>
/// <see cref="Exception"/> that an interface was passed as the generic type of an <see cref="IEnumerable{T}"/>
/// </summary>
/// <param name="interfaceType"></param>
public InterfaceEnumerablePassedException(Type interfaceType)
: base($"Interface {interfaceType.FullName} was passed to an IEnumerable<T>. This is not allowed.")
{
InterfaceType = interfaceType;
}
public Type InterfaceType { get; }
}
}

@ -25,4 +25,8 @@
<PackageReference Include="LightweightIocContainer" Version="2.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GBase.Api\GBase.Api.csproj" />
</ItemGroup>
</Project>

@ -344,6 +344,17 @@
</summary>
<returns>A <see cref="T:System.Threading.Tasks.ValueTask"/> to await</returns>
</member>
<member name="T:GBase.Exceptions.InterfaceEnumerablePassedException">
<summary>
<see cref="T:System.Exception"/> that an interface was passed as the generic type of an <see cref="T:System.Collections.Generic.IEnumerable`1"/>
</summary>
</member>
<member name="M:GBase.Exceptions.InterfaceEnumerablePassedException.#ctor(System.Type)">
<summary>
<see cref="T:System.Exception"/> that an interface was passed as the generic type of an <see cref="T:System.Collections.Generic.IEnumerable`1"/>
</summary>
<param name="interfaceType"></param>
</member>
<member name="T:GBase.Factories.IGBaseEntryFactory">
<summary>
Factory for the <see cref="T:GBase.Interfaces.IGBaseEntry"/>
@ -539,6 +550,14 @@
<param name="enumerable">The <see cref="T:System.Collections.IEnumerable"/></param>
<returns></returns>
</member>
<member name="M:GBase.Helpers.Enumerables.ConvertToGBaseEnumerable``1(System.String)">
<summary>
Convert a given <see cref="T:System.String"/> to an <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:System.Type"/> <typeparamref name="TEnumerable"/>
</summary>
<typeparam name="TEnumerable">The <see cref="T:System.Collections.Generic.IEnumerable`1"/> <see cref="T:System.Type"/></typeparam>
<param name="string">The given <see cref="T:System.String"/></param>
<returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:System.Type"/> <typeparamref name="TEnumerable"/></returns>
</member>
<member name="T:GBase.Installers.DataHandlingInstaller">
<summary>
<see cref="T:LightweightIocContainer.Interfaces.Installers.IIocInstaller"/> for the data handling

@ -2,13 +2,20 @@
// 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 = ',';
/// <summary>
/// Convert an <see cref="IEnumerable"/> to a GBase <see cref="string"/>
/// </summary>
@ -19,14 +26,51 @@ namespace GBase.Helpers
StringBuilder @string = new StringBuilder();
foreach (var item in enumerable)
{
@string.Append($"{item},");
@string.Append($"{item}{ENUMERABLE_STRING_DIVIDER}");
}
char lastChar = @string[^1];
if (lastChar == ',')
if (lastChar == ENUMERABLE_STRING_DIVIDER)
@string.Remove(@string.Length - 1, 1);
return @string.ToString();
}
/// <summary>
/// Convert a given <see cref="string"/> to an <see cref="IEnumerable{T}"/> of <see cref="Type"/> <typeparamref name="TEnumerable"/>
/// </summary>
/// <typeparam name="TEnumerable">The <see cref="IEnumerable{T}"/> <see cref="Type"/></typeparam>
/// <param name="string">The given <see cref="string"/></param>
/// <returns>An <see cref="IEnumerable{T}"/> of <see cref="Type"/> <typeparamref name="TEnumerable"/></returns>
public static TEnumerable ConvertToGBaseEnumerable<TEnumerable>(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;
}
}
}

@ -0,0 +1,7 @@
// Author: Gockner, Simon
// Created: 2020-02-14
// Copyright(c) 2020 SimonG. All Rights Reserved.
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Test.GBase")]
Loading…
Cancel
Save