ln.objects/ng/mappings/ListMapping.cs

147 lines
4.4 KiB
C#

// /**
// * File: ListMapping.cs
// * Author: haraldwolff
// *
// * This file and it's content is copyrighted by the Author and / or copyright holder.
// * Any use wihtout proper permission is illegal and may lead to legal actions.
// *
// *
// **/
using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;
using ln.objects.catalog;
namespace ln.types.odb.ng.mappings
{
public class ListMapping : IODBMapping
{
public Type TargetType { get; }
public ListMapping(Type targetType)
{
TargetType = targetType;
}
private Array UnmapArray(Mapper mapper, ODBList list)
{
Array array = Array.CreateInstance(TargetType.GetElementType(), list.Count);
for (int n = 0; n < list.Count; n++)
array.SetValue(mapper.UnmapValue(TargetType.GetElementType(), list[n]), n);
return array;
}
private ODBList MapArray(Mapper mapper, Array array)
{
ODBList list = new ODBList();
for (int n = 0; n < array.Length; n++)
{
list.Add(mapper.MapValue(array.GetValue(n)));
}
return list;
}
public object UnmapList(Mapper mapper, ODBList list)
{
IList ilist = (IList)Activator.CreateInstance(TargetType, true);
for (int n = 0; n < list.Count; n++)
{
ilist.Add(mapper.UnmapValue(TargetType.GetGenericArguments()[0], list[n]));
}
return ilist;
}
public ODBList MapList(Mapper mapper, object value)
{
ODBList list = new ODBList();
IList ilist = (IList)value;
for (int n = 0; n < ilist.Count; n++)
list.Add(mapper.MapValue(ilist[n]));
return list;
}
public object UnmapSet(Mapper mapper, ODBList list)
{
Type entype = typeof(UnmappingEnumeration<>).MakeGenericType(TargetType.GetGenericArguments());
object en = Activator.CreateInstance(entype, mapper, list);
return Activator.CreateInstance(TargetType, en );
}
public ODBList MapSet(Mapper mapper, object value)
{
ODBList list = new ODBList();
IEnumerable ienum = (IEnumerable)value;
foreach (object item in ienum)
list.Add(mapper.MapValue(item));
return list;
}
public object UnmapValue(Mapper mapper, ODBEntity oval)
{
if (TargetType.IsArray)
return UnmapArray(mapper, (ODBList)oval);
if (TargetType.IsGenericType)
{
if (typeof(List<>).Equals(TargetType.GetGenericTypeDefinition()))
{
return UnmapList(mapper, (ODBList)oval);
}
else if (typeof(HashSet<>).Equals(TargetType.GetGenericTypeDefinition()))
{
return UnmapSet(mapper, (ODBList)oval);
}
}
throw new NotImplementedException();
}
public ODBEntity MapValue(Mapper mapper, object value)
{
if (TargetType.IsArray)
return MapArray(mapper, (Array)value);
if (TargetType.IsGenericType)
{
if (typeof(List<>).Equals(TargetType.GetGenericTypeDefinition()))
{
return MapList(mapper, value);
}
else if (typeof(HashSet<>).Equals(TargetType.GetGenericTypeDefinition()))
{
return MapSet(mapper, value);
}
}
throw new NotImplementedException();
}
class UnmappingEnumeration<T> : IEnumerable<T>
{
Type TargetType;
Mapper mapper;
ODBList list;
public UnmappingEnumeration(Mapper mapper,ODBList list)
{
TargetType = typeof(T);
this.mapper = mapper;
this.list = list;
}
public IEnumerator<T> GetEnumerator()
{
foreach (ODBEntity item in list)
yield return (T)mapper.UnmapValue(TargetType, item);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
}